面试题答案
一键面试- 修改结构体定义:
- 使用
Cell
类型来实现内部可变性。Cell
允许在不可变引用上进行修改。
use std::cell::Cell; struct Counter { value: Cell<i32>, }
- 使用
- 修改
new
方法:- 初始化
Cell
类型的value
。
impl Counter { fn new() -> Counter { Counter { value: Cell::new(0) } } }
- 初始化
- 修改
increment
方法:- 使用
Cell
的set
方法来修改值。
impl Counter { fn increment(&self) { self.value.set(self.value.get() + 1); } }
- 使用
完整代码如下:
use std::cell::Cell;
struct Counter {
value: Cell<i32>,
}
impl Counter {
fn new() -> Counter {
Counter { value: Cell::new(0) }
}
fn increment(&self) {
self.value.set(self.value.get() + 1);
}
}
另外,如果需要在多线程环境下使用内部可变性,可以使用RefCell
(单线程安全)或Mutex
(多线程安全)。例如使用RefCell
的方式如下:
- 修改结构体定义:
use std::cell::RefCell; struct Counter { value: RefCell<i32>, }
- 修改
new
方法:impl Counter { fn new() -> Counter { Counter { value: RefCell::new(0) } } }
- 修改
increment
方法:impl Counter { fn increment(&self) { let mut value = self.value.borrow_mut(); *value += 1; } }
完整代码如下:
use std::cell::RefCell;
struct Counter {
value: RefCell<i32>,
}
impl Counter {
fn new() -> Counter {
Counter { value: RefCell::new(0) }
}
fn increment(&self) {
let mut value = self.value.borrow_mut();
*value += 1;
}
}