Rust String AsRef<T> 不会自动借用 [u8]

Roh*_*rma 3 rust

Rust String 实现了AsRef<str>AsRef<[u8]>

但是为什么 Rust 正确地允许将 String 借用为&str而不是&[u8],即使我们提供了显式类型注释提示?

let s = String::from("hello");
let item: &str = &s; // Works
let item2: &[u8] = &s; // Fails
Run Code Online (Sandbox Code Playgroud)

当然显式调用是有效的,但好奇为什么上面不起作用

let item2: &[u8] = s.as_ref();
Run Code Online (Sandbox Code Playgroud)

Kev*_*eid 5

当 a&String强制为时&str,这是通过Deref特质(notAsRef和 not Borrow)发生的。该Deref特征不是通用的 \xe2\x80\x94\xc2\xa0 它只允许选择一种类型来 \xe2\x80\x9cdereference 到 \xe2\x80\x9d。在 的情况下String,那就是str

\n

和特征对于编译器来说并不AsRef特殊。它们可供通用代码显式使用而不是隐式使用。Borrow

\n