Borrow
和AsRef
特质在Rust中非常相似。如果我理解正确,它们在被实现于同一类型时有着完全相同的签名(除了方法名),区别在于它们的使用方式。但当你查看它们的实现,比如在
Vec<T>
上,会有一个微妙的差别:
slice.rs:#[stable(feature = "rust1", since = "1.0.0")]
impl<T> Borrow<[T]> for Vec<T> {
fn borrow(&self) -> &[T] {
&self[..]
}
}
#[stable(feature = "rust1", since = "1.0.0")]
impl<T> AsRef<[T]> for Vec<T> {
fn as_ref(&self) -> &[T] {
self
}
}
我认为这里实现的AsRef
之所以有效是因为Deref
强制转换。但是同样的机制是否可以用于Borrow
实现呢?
Borrow
更早)。这不够了吗? - Chayim FriedmanAsRef
的实现是在说:“给出底层切片的引用”。与此同时,Borrow
的实现则是在说:“从向量中借用子切片..
(即所有元素)”。话虽如此,这两者之间的区别可能是语义上的,也可能是为了让编译器知道在Borrow
中你正在借用一个子切片而不是整个向量本身。 - Terens TareAsRef
和Borrow
特质之间的实际区别,这里的答案提供了一些有用的见解:为什么T没有实现AsRef<T>? - kmdreko