【发布时间】:2019-03-02 19:06:14
【问题描述】:
我为 Rust 中的一个简单结构编写了以下代码。这只是一个例子,没有太多真正的逻辑:
struct Vec2 {
x: f32,
y: f32,
}
impl Vec2 {
fn multiply(&mut self, other: &Vec2) {
self.x *= other.x;
self.y *= other.y;
}
}
我可以创建简单的向量并将一个向量与另一个向量相乘,但是当我尝试将一个向量与自身相乘时遇到了一个问题:编译器抱怨我不能将该向量借用为可变的,因为它也被借用为不可变。
fn main() {
let mut vec = Vec2 { x: 2.0, y: 2.3 };
vec.multiply(&vec);
}
error[E0502]: cannot borrow `vec` as mutable because it is also borrowed as immutable
--> src/main.rs:15:5
|
15 | vec.multiply(&vec);
| ^^^^--------^----^
| | | |
| | | immutable borrow occurs here
| | immutable borrow later used by call
| mutable borrow occurs here
这是有道理的,但是将这样的向量与自身相乘的正确方法是什么?更重要的是:对于一般情况下,我需要使用自己的方法修改结构,并使用相同的结构作为参数。
【问题讨论】:
-
在这种特殊情况下,最简单的解决方案是为
Vec2派生Copy,并通过值而不是通过引用来接受other。
标签: methods rust borrow-checker mutability