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 行目で、これら 2 つの変数を変更する最善の方法を誰か説明できますか? 正しく使用していないか、どこか selfが欠けているようです。mut

17行目では、次のようlifetime mismatchにも言っています。

タイプの不一致: '&Vector2' が予期されていましたが、'&Vector2' が見つかりました... 14:41 にブロックで定義された匿名の有効期間 #1 は、14:41 でブロックに定義された匿名の有効期間 #2 よりも長生きするとは限りません。

これら2つの問題を解決する方法を知っている人はいますか?

4

1 に答える 1

3

add変更操作を行いたい場合&mut selfは、&self.

add新しいを作成したい場合は、変更Vector2を試みないでください— クローンを作成selfし (0.8-pre と仮定します。0.7 では代わりに を使用してコピーしますcopy self)、クローンを変更するか、同じタイプの新しいインスタンスを作成します。( のような場合はこちらの方が速くなりますadd

あなたがそれに取り組んでいる間、単に : implement というメソッドを持たないでください。そうすればうまくいきaddます! (まだありません — https://github.com/mozilla/rust/issues/5992を参照してください。)std::ops::Add++=

最終的なコード:

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 に答える