如何从&self中制作&mut?

And*_*rew 2 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();
}
Run Code Online (Sandbox Code Playgroud)

编译此代码时出现错误

不可借用不可变借的内容*self是可变的

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

Sim*_*ead 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
}
Run Code Online (Sandbox Code Playgroud)


rod*_*igo 5

您无法完成您想要的操作:您无法将不可变引用转换为可变引用。

但你几乎可以通过以下方式获得RefCell

struct Foo { value: RefCell<i32> }

impl Foo {
    fn f1(&self) {
        let mutValue = self.value.borrow_mut();
        *mutValue = 5;
    }
}
Run Code Online (Sandbox Code Playgroud)

我什至不需要这个f2功能!

  • 使用“UnsafeCell”是一个坏主意;几乎总是您想要使用“RefCell”或“Cell”,后者用于“复制”数据。 (2认同)
  • @rodrigo:扩展弗拉基米尔的观点。“UnsafeCell”是基本的不安全功能,它是“Cell”和“RefCell”的基础,因此最终使用它,重要的是“不安全”,您必须了解代码需要维护的不变量。`Cell` 和 `RefCell` 的作者了解这些不变量,并提供了一个安全的接口来自动为您维护它们;从而使您的工作更加轻松。 (2认同)