【问题标题】:What is the difference between automatic dereferencing and Deref coercion in Rust?Rust 中的自动取消引用和 Deref 强制有什么区别?
【发布时间】:2022-11-07 07:09:06
【问题描述】:

根据问题,假设我有以下代码:

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 强制,但这与您尚未实现 Deref 的事实有何关系?
  • 你还没有为Test 实现Deref,但是对于任何&T 仍然有一个毯子Deref<Target = T> impl。所以&&T 可以强制转换为&T
  • @cameron1024 从技术上讲,这不是使用 Deref impl(相反 - 它对 &T 使用内置取消引用,它只需要泛型)。
  • @ChayimFriedman:嗯?它正是通过<&T as Deref>::deref(&self) -> &T 使用(传递)强制。
  • @eggyal这个impl存在,但它不是编译器使用的(除非在通用上下文中)。它本身是递归的——它指的是引用的内置取消引用。

标签: rust


【解决方案1】:

解除强制

如果您有一个类型 U,并且它实现了 Deref<Target=T>,则 &U 的值将自动强制转换为 &T。

自动化引用/取消引用

调用方法是 Rust 中少数具有这种行为的地方之一。

它是这样工作的:当你使用 object.something() 调用方法时,Rust 会自动添加 &、&mut 或 *,以便对象与方法的签名相匹配。换句话说,以下是相同的:

p1.distance(&p2);

(&p1).distance(&p2);

这种自动引用行为之所以有效,是因为方法有一个明确的接收者——self 的类型。给定方法的接收者和名称,Rust 可以明确地确定该方法是读取 (&self)、变异 (&mut self) 还是消费 (self)。

资料来源: 您可以在此处阅读有关 Deref 强制的信息:https://web.mit.edu/rust-lang_v1.25/arch/amd64_ubuntu1404/share/doc/rust/html/book/first-edition/deref-coercions.html#deref-coercions。

您可以在此处阅读有关自动引用/引用的信息:https://web.mit.edu/rust-lang_v1.25/arch/amd64_ubuntu1404/share/doc/rust/html/book/second-edition/ch05-03-method-syntax.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-14
    • 2012-06-20
    • 2023-04-06
    • 2015-04-15
    相关资源
    最近更新 更多