rust 包含多个“&”符号的程序工作正常[重复]

omtl5h9j  于 2023-01-17  发布在  其他
关注(0)|答案(2)|浏览(105)
    • 此问题在此处已有答案**:

What are Rust's exact auto-dereferencing rules?(4个答案)
Confusion over auto-dereferencing rules when using function(1个答案)
四年前关闭了。
以下程序工作正常:

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

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

事实上,它可以传递任意数量的&,我应该如何解释这是怎么回事呢?
我的 rust 版:

$ rustc --version
rustc 1.32.0-nightly (13dab66a6 2018-11-05)
icnyk63a

icnyk63a1#

摘自《铁 rust 》一书:
Deref强制是Rust在函数和方法的参数上执行的一种便利。Deref强制将对实现Deref的类型的引用转换为对Deref可以将原始类型转换为的类型的引用。当我们将对特定类型的值的引用作为参数传递给与函数或方法定义中的参数类型不匹配的函数或方法时,Deref强制会自动发生。对deref方法的一系列调用将我们提供的类型转换为参数需要的类型。
所以基本上,在函数参数中,编译器会自动删除任何写入的或隐含的&,直到它到达一个可以传递给函数的类型。

webghufk

webghufk2#

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

foo(&&&f)

转换为:

foo(&****(&&&f))

这就引出了正确的调用:

foo(f)

根据需要插入尽可能多的*实际上是由Deref trait的这个总括实现来执行的:

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

    fn deref(&self) -> &T { *self }
}

注意:我更新了我的答案,因为在原始答案中我错误地使用了术语autoderef,有关详细信息,请参见this post

相关问题