1

鉴于此代码(也在此处):

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,还说:

不匹配的类型:预期 '&Vector2' 但找到了 '&Vector2'...在 14:41 在块上定义的匿名生命周期 #1 不一定比在 14:41 在块上定义的匿名生命周期 #2 长。

有谁知道解决这两个问题的任何方法?

4

1 回答 1

3

如果您希望进行add变异操作,则应采用&mut self而不是&self.

如果您希望add创建一个新的Vector2,则不要尝试变异self- 克隆它(假设 0.8-pre;在 0.7 上,您将使用 复制它copy self)并修改克隆,或创建一个具有相同类型的新实例。(在add.

当您使用它时,不要只有一个名为add: implement的方法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}
于 2013-08-03T03:10:10.727 回答