`str` 是否实现了 `Borrow<str>`?

Does `str` implement `Borrow<str>`?

我在看 Rust 中的 Borrow<Borrowed> 特性,我理解我们想要一个泛型函数允许参数 K 或其借用形式 Q 这样的想法K: Borrow<Q>。如果我查看 String 实现,我发现它实现了 Borrow<str>,这解释了为什么在以下代码段中传递 &String 有效。我想知道传递 &str 是如何工作的:这是否意味着 str 实现了... Borrow<str>?如果不是,str 如何满足给定 P 泛型的特征?

use std::borrow::Borrow;
use std::fmt::Display;

fn main() {
    let foo = String::from("I'm a String");
    print(&foo);
    print("I'm a str");
}

fn print<P>(arg: &P) 
where
    P: Borrow<str> + ?Sized + Display
{
    println!("{}", arg)
}

是的,您可以在 doc

中轻松查找
impl<T> Borrow<T> for T where T: ?Sized, 

这意味着对于任何类型 TBorrow<T> 是为 T 实现的。 where T: ?Sized 表示 T 可以动态调整大小。如果未添加特征 "bound"(此处更放松)where T: ?Sized,则 T 将不包括动态大小的类型,如 str 或其他切片类型。