我似乎不明白为什么:
let a = Box::new(5i32);
let _:() = *a;
告诉我,第二行上指定的类型是i32
,而不是&i32
,因为Deref.deref()
(我假设它在*a
处被调用)返回&T
.
另外,如果我自己打deref()
:
let _:() = <Box<i32> as Deref>::deref(&a);
我得到了预期的&i32
分.
我似乎不明白为什么:
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
的存在使其具有可扩展性.
最后一点掩盖了一些细节.
另见: