我想暴露一个具有不可变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是可变的
是否有可能让自己变得可变?
编辑:
在错过了最后一句话之后......你可以在以下情况下将财产包裹起来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)
您无法完成您想要的操作:您无法将不可变引用转换为可变引用。
但你几乎可以通过以下方式获得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功能!