[我正在看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
的大小。如果未添加特征“绑定”(这里有更多放松),则where T: ?Sized
将不包括动态调整大小的类型,例如T
或其他切片类型。