具有多个“&”号的程序可以正常工作

时间:2018-11-14 06:57:31

标签: rust

以下程序可以正常工作:

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)

2 个答案:

答案 0 :(得分:4)

来自the Rust book

  

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