2013-08-03 4 views
1

(또한 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을주고 :

일치하지 않는 유형을 '& Vector2'예상하지만 '& Vector2'발견 ... 익명의 수명을 # 1의 블록에 정의 14:41의 블록에서 정의 된 익명의 수명 # 2는 반드시 오래 남아 있지 않습니다.

아무도이 두 가지 문제를 해결할 방법을 알고 있습니까?

+0

I 녹이 사용하지 않았지만 불변이라면 변형 시키면 안됩니다. add 메서드에서 새 Vector2를 만들고 대신 반환하십시오. – Mike

답변

3

add을 돌연변이 연산으로 사용하려면 &self이 아닌 을 사용해야합니다. (0.8 미리 가정 0.7에 대신 copy self로 복사 것)

당신은 self -clone를 돌연변이 시도하지 않는, add 새로운 Vector2을 만들도록하려는 경우와 복제를 수정하거나 만들 같은 타입의 새로운 인스턴스. (이 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}