我怎样才能使某些结构域可变?

时间:2017-12-11 07:20:02

标签: struct rust mutability

我有一个结构:

pub struct Test {
    pub x: i32,
    pub y: i32,
}

我希望有一个能够改变这种情况的功能 - 简单:

pub fn mutateit(&mut self) {
    self.x += 1;
}

这使得整个结构在mutateit的函数调用期间是可变的,对吗?我想要改变x,我不想改变y。有没有办法可以随意借用x

1 个答案:

答案 0 :(得分:6)

引用The Book

  

Rust在语言级别不支持字段可变性,所以你不能写这样的东西:

struct Point {
    mut x: i32, // This causes an error.
    y: i32,
}

你需要内部可变性,这在the standard docs

中有很好的描述
use std::cell::Cell; 

pub struct Test {
    pub x: Cell<i32>,
    pub y: i32
}

fn main() {
    // note lack of mut:
    let test = Test {
        x: Cell::new(1), // interior mutability using Cell
        y: 0
    };

    test.x.set(2);
    assert_eq!(test.x.get(), 2);
}

而且,如果你想将它合并到一个函数中:

impl Test {
    pub fn mutateit(&self) { // note: no mut again
        self.x.set(self.x.get() + 1);
    }
}

fn main() {
    let test = Test {
        x: Cell::new(1),
        y: 0
    };

    test.mutateit();
    assert_eq!(test.x.get(), 2);
}