当我从Rust库中阅读文档时遇到了这段代码:
for (ent, pos, vel) in (&*entities, &mut pos_storage, &vel_storage).join() {
println!("Processing entity: {:?}", ent);
*pos += *vel;
}
原始链接:https://slide-rs.github.io/specs/08_join.html
&*实体在这里做什么。据我所知,它是取消引用实体,然后再次引用它?
答案 0 :(得分:6)
这是一个显式的重新借用,它是不时出现在Rust中的一个常见习语。
&
仅具有一种含义:它接受类型为T
的表达式(必须为place expression)并借用对类型{的引用{1}}。
对于引用,&T
的作用与*
相反-它接受引用(&
)并生成类型&T
的位置表达式。但是T
可能具有不同类型的指针,这意味着不同,因为您可以通过实现*
来覆盖它。由于Deref
与automatically dereferences the return value of Deref::deref
的编译器魔术联系在一起,因此您可以借用*
运算符借用*
的结果,并将其返回为普通引用。
因此,&
是一种将“指向&*foo
的任何指针”重新借用为T
的方式,等效于手动调用&T
。
(以上说明也适用于Deref::deref(&foo)
借用-只需将&mut
替换为&
,将&mut
替换为Deref
。)
在示例中,您不清楚链接DerefMut
是什么,但是它可能是某种智能指针,其中entities
方法需要简单的引用。对于需要这样做的另一个示例,请考虑使用SliceConcatExt::concat
来串联join()
和String
s:
&str