自动解引用和 Rust 中的 Deref 强制转换有什么区别?

4
根据问题,假设我有以下代码:
struct Test {
 x: i32
}

fn main() {
 let test1 = Test { x: 32 }; // type inference by vscode: Test
 let test2 = &test1          // type inference by vscode: &Test
 let test3 = &test2          // type inference by vscode: &&Test

 let explicit_ref: &Test = &test3; // This should give an error but works as I haven't implemented 
                                   //Deref trait.
}

我有漏掉什么或者是我误解了自动取值和取值引用强制转换吗?

是的,在这里发生了解引用强制转换,但这与您尚未实现“Deref”有什么关系? - Chayim Friedman
2
你还没有为 Test 实现 Deref,但是仍然有一个针对任何 &T 的通用 Deref<Target = T> 实现。因此,&&T 可以被强制转换为 &T - cameron1024
2
@cameron1024 从技术上讲,这不是使用此 Deref 实现(相反-它使用内置的 &T 解引用,仅适用于泛型)。 - Chayim Friedman
1
@ChayimFriedman:什么?它确切地使用(可传递的)强制转换通过[<&T as Deref> :: deref(&self)->&T](https://doc.rust-lang.org/src/core/ops/deref.rs.html#80-87)。 - eggyal
2
@eggyal 这个实现是存在的,但编译器不使用它(除非在通用上下文中)。它本身是递归的 - 它引用了引用的内置解引用。 - Chayim Friedman
1个回答

1
解引用强制转换 如果您有一个类型U,并且它实现了Deref<Target=T>,那么&U的值将自动强制转换为&T。 自动引用/解引用 在Rust中,调用方法是少数几个具有这种行为的地方之一。
下面是它的工作原理:当您调用对象.something()方法时,Rust会自动添加&、&mut或*,以使对象与方法的签名匹配。换句话说,以下内容相同:
p1.distance(&p2);

(&p1).distance(&p2);

这种自动引用行为的原因在于方法有一个明确的接收器——self 的类型。给定方法的接收器和名称,Rust 可以确定该方法是读取 (&self)、变异 (&mut self) 还是消耗 (self)。
来源:
您可以在此处阅读有关 Deref 强制转换的内容here
您可以在此处阅读有关自动引用/引用的内容here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接