我似乎不明白为什么:

let a = Box::new(5i32);
let _:() = *a;

告诉我,第二行上指定的类型是i32,而不是&i32,因为Deref.deref()(我假设它在*a处被调用)返回&T.

另外,如果我自己打deref():

let _:() = <Box<i32> as Deref>::deref(&a);

我得到了预期的&i32分.

推荐答案

*foo和拨打foo.deref()不一样.如果是的话,你就可以真正地go 引用一个值^_^

*是"拨打Deref::deref,然后进入提供的地址"的语法糖.这正是人们对那个操作员的期望.Deref的存在使其具有可扩展性.

最后一点掩盖了一些细节.

另见:

Rust相关问答推荐

给定使用newype习语定义的类型上的铁 rust Vec,有没有方法获得底层原始类型的一部分?

有没有方法处理rust中嵌套的ok_or()?

为什么父作用域中的变量超出了子作用域

如何在Rust中获得不可辩驳的'if let'模式警告Mutex锁定?""

将此字符串转换为由空格字符分隔的空格

返回的future 不是`发送`

在Rust中显式装箱受生存期限制的转换闭包

如何为rust trait边界指定多种可能性

失真图像图形捕获Api

这是什么:`impl Trait for T {}`?

类型生命周期绑定的目的是什么?

sha256 摘要仅适用于 &*

注释闭包参数强调使用高阶排定特征界限

没有明确地说return会产生错误:match arms have incompatible types

如何在 Rust 中将 bson::Bson 转换为 Vec

无法理解 Rust 对临时值的不可变和可变引用是如何被删除的

在空表达式语句中移动的值

将文件的第一行分别读取到文件的其余部分的最有效方法是什么?

tokio async rust 的 yield 是什么意思?

相互调用的递归异步函数:检测到循环