如何使用共享可变结构字段在相同的方法中读取和写入

How to use a share mutable struct field to read and write to in the same method

提问人:hope_is_grim 提问时间:10/24/2023 最后编辑:cafce25hope_is_grim 更新时间:10/24/2023 访问量:70

问:

我正在尝试在我的结构中使用共享来进行一些计算Vec3Mat4

struct Vec3 {
  x: f32;
  y: f32;
}

struct Mat4 {
  values: [f32;16];
  tmp_vec3: Vec3;
}

我里面有这个方法:Mat4

impl Mat4 {
  pub fn set_to_look_at(&mut self, position: &Vec3, target: &Vec3, up: &Vec3) -> &mut Self {
    let tmp_vec = &mut self.tmp_vec3;
    tmp_vec.set_from(target).sub(position);
    self.look_at(position, &tmp_vec, up)
  }

}

此代码无法编译,抱怨.cannot borrow '*self' as mutable more than once at a time

这是什么模式?

Rust 借用检查器 所有权

评论

2赞 Aleksander Krauze 10/24/2023
可以肯定的是,您必须向我们展示 和方法,但我认为问题出在行上。 可变借用,所以(我相信)确实如此。即使在实现中您没有更改,编译器也无法看到这一点。也许你可以内联这个函数,它会起作用,但要确保你必须提供完整的最小可重现的例子。set_fromsublook_atself.look_at(position, &tmp_vec, up)tmp_vecselflook_atself.tmp_vec3
4赞 cdhowie 10/24/2023
Vec3足够小,您可能应该只制作它并传递值而不是引用。在 64 位计算机上,它的大小与指针的大小相同,因此复制它的工作量与传递引用相同,但不进行间接操作。所以没有缺点,只有好处,包括解决这个问题。CopyVec3
0赞 hope_is_grim 10/24/2023
@cdhowie我当前的实现实际上初始化了一个新的 Vec3,但对于更大的东西(如临时 Mat4),我希望拥有该共享实例。
0赞 BallpointBen 10/27/2023
编译器禁止此代码是正确的;没有 ,指向 ,因此可以修改 尽管是不可变的引用。任何合理的实现都必须以某种方式复制或克隆,然后才能在 中使用。Vec3Copytmp_vecself.tmp_vec3self.look_attmp_vecself.look_at
1赞 hope_is_grim 10/29/2023
@BallpointBen现在明白了,我只需要一个根本不接受任何 Vec3 的新方法,而不是重叠的借用,因为该 vec3 已经可以访问了。Vec3 不是一个很好的例子,一个 [f32;32]应该是一个更好的。不复制为该方法保存了我的批次 ~10 FPS 将每帧调用一次。self

答: 暂无答案