Avatar ·

Rust中自动解引用的确切规则是什么?

大家好!我最近开始学习Rust,经常搞不清编译器何时以及如何自动解引用。例如,我看到可以对`&String`调用`len()`方法,尽管`len()`是为`String`定义的。或者可以将`&i32`传递给期望`i32`的函数,Rust会自动解引用吗? 以下是一些让我困惑的例子: ```rust fn main() { let s = String::from("hello"); let r = &s; println!("{}", r.len()); // 能行!但r是&String,不是String let x = 5; let y = &x; let z = *y; // 这里我理解——需要显式解引用 println!("{}", z); // 但这里——为什么能行? let v = vec![1, 2, 3]; let v_ref = &v; println!("{}", v_ref[0]); // v_ref是&Vec,但我们使用了索引 } ``` 我读过关于`Deref`和`DerefMut` trait的内容,但并未完全理解编译器如何决定何时应用自动解引用。是否有明确的规则集?为什么在