gpt4 book ai didi

rust - 自动解除引用和解除引用强制之间有什么关系?

转载 作者:行者123 更新时间:2023-12-03 11:31:16 24 4
gpt4 key购买 nike

经过一番discussion , 我现在对 auto-dereferencing 之间的关系有点困惑和 deref coercion .

It seems仅当要取消引用的目标是方法接收器时,“自动取消引用”一词才适用,
it seems术语“deref coercion”适用于函数参数和它需要的所有上下文。

我认为取消引用并不总是涉及取消引用强制,但我不确定:取消引用是否总是使用一些 Deref::deref特征实现?

如果是,是 T: Deref<Target = U> where T: &U 的实现者吗?编译器内置?

最后,在编译器隐式转换 &&&&x 的所有情况下使用术语“autoderef”听起来很自然。至&x :

pub fn foo(_v: &str) -> bool {
false
}

let x="hello world";
foo(&&&&x);

这是社区的普遍共识吗?

最佳答案

这两种情况之间的相似之处是相当肤浅的。
在方法调用表达式中,编译器首先需要确定调用哪个方法。该决定基于接收器的类型。编译器构建候选接收器类型列表,其中包括通过重复取消引用接收器获得的所有类型,还包括 &T&mut T适用于所有类型 T遭遇。这就是为什么您可以调用接收 &mut self 的方法的原因。直接作为x.foo()而不必写(&mut x).foo() .对于候选列表中的每种类型,编译器然后查找固有方法和可见特征上的方法。见language reference了解更多详情。
deref 强制是相当不同的。它只发生在编译器确切知道期望什么类型的强制站点。如果遇到的实际类型与预期类型不同,编译器可以使用任何强制(包括 deref 强制)将实际类型转换为预期类型。可能的强制列表包括未调整大小的强制、指针弱化和 deref 强制。见chapter on coercions in the Nomicon了解更多详情。
所以这实际上是两种完全不同的机制——一种用于寻找正确的方法,另一种用于在已经知道确切期望的类型时转换类型。第一种机制还自动引用接收器,这在强制中永远不会发生。

I thought that a dereference does not always involve deref coercion, but I'm not sure: does dereferencing always use some Deref::deref trait implementation?


并非每次解除引用都是解除引用强制。如果你写 *x ,您明确取消引用 x .相反,deref 强制是由编译器隐式执行的,并且仅在编译器知道预期类型的​​地方执行。
semantics of dereferencing取决于 x 的类型是指针类型,即引用或原始指针,或者不是。对于指针类型, *x表示对象 x指向,而对于其他类型 *x相当于 *Deref::deref(&x) (或这个可变的比喻)。

If so, is the implementor of T: Deref<Target = U> where T: &U built into the compiler?


我不太确定你的语法应该是什么意思——它肯定不是有效的 Rust 语法——但我猜你在问是否取消引用 &T 的实例至 T内置在编译器中。如上所述,指针类型的解引用,包括引用,是编译器内置的,但也有一个 blanket implementation of Deref for &T 在标准库中。这个一揽子实现对于通用代码很有用——特征绑定(bind) T: Deref<Target = U>否则不允许 T = &U .

关于rust - 自动解除引用和解除引用强制之间有什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65148147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com