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