Rust String实现了AsRef和AsRef〈[u8]〉
但是为什么Rust正确地允许String作为**&str被借用,而不允许作为&[u8]**被借用,即使我们提供了显式的类型注解提示?
let s = String::from("hello");
let item: &str = &s; // Works
let item2: &[u8] = &s; // Fails
当然,显式调用可以工作,但奇怪的是,为什么上面的方法不起作用
let item2: &[u8] = s.as_ref();
1条答案
按热度按时间tzdcorbm1#
当一个
&String
强制为&str
时,这是通过Deref
特性来实现的(不是AsRef
,也不是Borrow
)。Deref
特性不是通用的--它只允许选择一个类型来“解引用”。在String
的情况下,那就是str
。AsRef
和Borrow
特性 * 对编译器来说并不是特殊的 *。它们可供泛型代码 * 显式 * 使用,而不是隐式使用。