如何从& self中制造和改变自我?

时间:2016-04-26 22:31:19

标签: rust

我想公开一个带有不可变self的公共函数,它调用一个带有可变self的私有函数。

struct Foo {
    value: i32,
}

impl Foo {
    fn f1(&self) {
        self.f2(); // <--- is it possible to make self mutable?
    }

    fn f2(&mut self) {
        self.value = 5;
    }
}

fn main() {
    let foo = Foo { value: 0 };
    foo.f1();
}

编译此代码时出现错误

  

不能将不可变借用内容*self借用为可变

是否有可能使自己变得可变?

2 个答案:

答案 0 :(得分:5)

编辑:

在错过了最后一句话之后...... 可以在Cell中包裹该属性:

use std::cell::Cell;

struct Foo { value: Cell<i32> }

impl Foo {
  fn f1(&self) {
    self.f2();
  }

  fn f2(&self) {
    self.value.set(5);
  }
}

fn main() {
    let foo = Foo { value: Cell::new(0) };
    foo.f1();
    println!("{:?}", foo.value.get()); // prints 5
}

答案 1 :(得分:3)

您无法做到的事情:您无法将非可变引用转换为可变引用。

但你可以通过RefCell得到几乎所有:

struct Foo { value: RefCell<i32> }

impl Foo {
    fn f1(&self) {
        let mutValue = self.value.borrow_mut();
        *mutValue = 5;
    }
}

我甚至不需要f2功能!