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的内容,但并未完全理解编译器如何决定何时应用自动解引用。是否有明确的规则集?为什么在