以下程序工作正常:
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)
因为编译器会自动取消引用引用链,所以您可以想象它会插入尽可能多的引用*以获得正确的类型:
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以错误的方式使用了该术语,请参阅这篇文章了解详细信息。
| 归档时间: |
|
| 查看次数: |
319 次 |
| 最近记录: |