在一些讨论之后,我现在对于自动解引用(auto-dereferencing)
和解引用强制转换(deref coercion)
之间的关系有些困惑。
看起来,术语"自动解引用"仅适用于要解引用的目标是一个方法接收器的情况, 而似乎术语"解引用强制转换"适用于函数参数以及所有需要的上下文。
我认为解引用并不总是涉及到解引用强制转换,但我不确定:解引用是否总是使用一些Deref :: deref
特质实现?
如果是这样,那么T: Deref<Target = U> where T: &U
的实现者是否内置于编译器中?
最后,在编译器隐式地将&&&&x
转换为&x
的所有情况下,使用术语"自动解引用"听起来很自然:
pub fn foo(_v: &str) -> bool {
false
}
let x="hello world";
foo(&&&&x);
这是社区的普遍共识吗?
fn deref(&self) -> &T { *self }
是幂等的,并且它不能解释 &&&&x -> &x。 - attdona&&T
的值映射到类型为&T
的值。 - Sven Marnachderef(&&T) -> &T
,而您似乎认为它是deref(&T) -> &T
。不过我可能误读了您的评论。 - Sven MarnachDeref
将&&T映射到&T吗?fn deref(&self) -> &T
,&T是从deref
函数返回的。Deref被实现为&T,并且返回值是&T,那么它如何将&&T映射到&T呢?非常感谢。 - Joeyself
参数的类型为&Self
,而Self
是&T
,因此&Self
就是&&T
。deref()
函数的返回类型显然是&T
,因此该函数从&&T
映射到&T
。 - Sven Marnach