rust - 不可变字段和生命周期不匹配

标签 rust

给定此代码(也是 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/

相关文章:

string - 如何将 Vec<String> 转换为 Vec<&str>?

rust - "mismatched types: expected ` ( )`"在使用 if 表达式时意味着什么?

rust - 检查 Option<String> 是否为 Some(my_string)

generics - 有没有办法在多个特征上实现一个特征?

rust - 我如何在 Rust 中获取 SHA256 的前 4 个字节?

reference - 我如何遍历借来的数组?

rust - 如何将红 bean 杉组件分离到不同的文件中?

rust - 对不可变数组切片的引用的逆序

rust - 如何在 Rust 中读取文本文件并读取每行多个值

macos - 如何使用 Rust 编写原生 Mac OS X GUI?