以下程序可以正常工作:
pub fn foo(_v: &str) -> bool {
false
}
fn main() {
let f = "hello world";
println!("{}", foo(&&&&f)); // note the number of & here
}
实际上,它可以通过任意数量的&
。我应该如何解释发生了什么事?
我的锈版本:
$ rustc --version
rustc 1.32.0-nightly (13dab66a6 2018-11-05)
答案 0 :(得分:4)
Deref强制是Rust在参数上执行的一种便利 功能和方法。 Deref强制将引用转换为类型 将Deref实现为对Deref可以引用的类型的引用 转换成原始类型。反强制自动发生 当我们传递对特定类型值的引用作为参数时 到与参数类型不匹配的函数或方法 函数或方法定义。对deref方法的一系列调用 将我们提供的类型转换为参数所需的类型。
因此,基本上,在函数参数中,编译器将自动删除任何书面或隐含的&
,直到它变为可以传递给函数的类型为止。
答案 1 :(得分:3)
由于编译器会自动取消对引用链的引用,因此您可能会以为它会插入必要的*号以获得正确的类型:
foo(&&&f)
转换为:
foo(*&*&*&f)
导致正确的调用:
foo(f)
根据*
特质的this blanket implementation实际上插入了所需的Deref
:
impl<'a, T: ?Sized> Deref for &'a T {
type Target = T;
fn deref(&self) -> &T { *self }
}
注意:我已经更新了答案,因为在原始版本中我以错误的方式使用了autoderef
一词,有关详细信息,请参见this post。