“&*”在Rust中起什么作用

时间:2019-06-28 13:00:33

标签: rust

当我从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

&*实体在这里做什么。据我所知,它是取消引用实体,然后再次引用它?

1 个答案:

答案 0 :(得分:6)

这是一个显式的重新借用,它是不时出现在Rust中的一个常见习语。

    表达式中的
  • &仅具有一种含义:它接受类型为T的表达式(必须为place expression)并借用对类型{的引用{1}}。

  • 对于引用,&T的作用与*相反-它接受引用(&)并生成类型&T的位置表达式。但是T可能具有不同类型的指针,这意味着不同,因为您可以通过实现*来覆盖它。由于Derefautomatically dereferences the return value of Deref::deref的编译器魔术联系在一起,因此您可以借用*运算符借用*的结果,并将其返回为普通引用。

因此,&是一种将“指向&*foo的任何指针”重新借用为T的方式,等效于手动调用&T

(以上说明也适用于Deref::deref(&foo)借用-只需将&mut替换为&,将&mut替换为Deref。)

在示例中,您不清楚链接DerefMut是什么,但是它可能是某种智能指针,其中entities方法需要简单的引用。对于需要这样做的另一个示例,请考虑使用SliceConcatExt::concat来串联join()String s:

&str

另请参见