[< T>u8]的Rust String AsRef未自动借用

iibxawm4  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(144)

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();
tzdcorbm

tzdcorbm1#

当一个&String强制为&str时,这是通过Deref特性来实现的(不是AsRef,也不是Borrow)。Deref特性不是通用的--它只允许选择一个类型来“解引用”。在String的情况下,那就是str
AsRefBorrow特性 * 对编译器来说并不是特殊的 *。它们可供泛型代码 * 显式 * 使用,而不是隐式使用。

相关问题