我想公开一个带有不可变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
借用为可变
是否有可能使自己变得可变?
答案 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
功能!