给定此代码(也是 here ):
struct Vector2 {
x: int,
y: int
}
impl Vector2 {
pub fn new(xs: int, ys: int) -> Vector2 {
Vector2 {
x: xs,
y: ys
}
}
fn add(&self, otr: Vector2) -> &Vector2 {
self.x += otr.x; // cannot assign to immutable field (line 15)
self.y += otr.y; // cannot assign to immutable field (line 16)
return self; // lifetime mismatch (line 17)
}
}
fn main() {
let mut vec1 = Vector2::new(42, 12);
println(fmt!("vec1 = [x: %?, y: %?]", vec1.x, vec1.y));
let vec2 = Vector2::new(13, 34);
println(fmt!("vec2 = [x: %?, y: %?]", vec2.x, vec2.y));
let vec3 = vec1.add(vec2);
println(fmt!("vec1 + vec2 = [x: %?, y: %?]", vec3.x, vec3.y))
}
第 15-17 行有问题。
对于第 15 行和第 16 行,有人可以解释一下更改这两个变量的最佳方法是什么吗?看来我要么没有正确使用 self
,要么我在某处遗漏了一个 mut
。
对于第 17 行,它给了我一个lifetime mismatch
,还说:
mismatched types: expected '&Vector2' but found '&Vector2'...the anonymous lifetime #1 defined on the block at 14:41 does not necessarily outlive the anonymous lifetime #2 defined on the block at 14:41.
有谁知道解决这两个问题的方法吗?
最佳答案
如果您希望 add
成为一个变异操作,它应该采用 &mut self
而不是 &self
。
如果你想让add
创建一个新的Vector2
,那么不要尝试改变self
——克隆它(假设0.8-pre ; 在 0.7 上,您将使用 copy self
) 复制它并修改克隆,或者创建一个具有相同类型的新实例。 (在像 add
这样的情况下,这会更快。
当你在做的时候,不要只有一个名为 add
的方法:实现 std::ops::Add
和 +
将工作! (还没有 +=
——参见 https://github.com/mozilla/rust/issues/5992。)
最终代码:
struct Vector2 {
x: int,
y: int,
}
impl Vector2 {
pub fn new(x: int, y: int) -> Vector2 {
Vector2 {
x: x,
y: y,
}
}
}
impl Add<Vector2, Vector2> for Vector2 {
fn add(&self, rhs: &Vector2) -> Vector2 {
Vector2 {
x: self.x + rhs.x,
y: self.y + rhs.y,
}
}
}
fn main() {
let vec1 = Vector2::new(42, 12);
println(fmt!("vec1 = %?", vec1));
// 0.8-pre hint: use printfln!(...) instead of println(fmt!(...))
let vec2 = Vector2::new(13, 34);
println(fmt!("vec2 = %?", vec2));
let vec3 = vec1 + vec2;
println(fmt!("vec1 + vec2 = %?", vec3));
}
及其输出:
vec1 = {x: 42, y: 12}
vec2 = {x: 13, y: 34}
vec1 + vec2 = {x: 55, y: 46}
关于rust - 不可变字段和生命周期不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18028473/