带有多个&符号的程序工作正常

Sib*_*ibi 4 rust

以下程序工作正常:

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

fn main() {
    let f = "hello world";
    println!("{}", foo(&&&&f)); // note the number of & here
}
Run Code Online (Sandbox Code Playgroud)

事实上,它适用于传递任意数量的&. 我应该如何解释正在发生的事情?

我的锈版:

$ rustc --version
rustc 1.32.0-nightly (13dab66a6 2018-11-05)
Run Code Online (Sandbox Code Playgroud)

Jmb*_*Jmb 5

锈书

Deref 强制是 Rust 对函数和方法的参数执行的一种便利。Deref 强制转换将对实现 Deref 的类型的引用转换为对 Deref 可以将原始类型转换为的类型的引用。当我们将特定类型值的引用作为参数传递给与函数或方法定义中的参数类型不匹配的函数或方法时,会自动发生取消引用强制。对 deref 方法的一系列调用将我们提供的类型转换为参数所需的类型。

所以基本上,在函数参数中,编译器将自动删除任何&书面或隐含的内容,直到它成为可以传递给函数的类型。


att*_*ona 5

因为编译器会自动取消引用引用链,所以您可以想象它会插入尽可能多的引用*以获得正确的类型:

foo(&&&f)
Run Code Online (Sandbox Code Playgroud)

转换为:

foo(&****(&&&f))
Run Code Online (Sandbox Code Playgroud)

这会导致正确的调用:

foo(f)
Run Code Online (Sandbox Code Playgroud)

*所需数量的插入实际上是通过特征的全面实现Deref来执行的:

impl<'a, T: ?Sized> Deref for &'a T {
    type Target = T;

    fn deref(&self) -> &T { *self }
}
Run Code Online (Sandbox Code Playgroud)

注意:我更新了我的答案,因为在原文中我autoderef以错误的方式使用了该术语,请参阅这篇文章了解详细信息。