MST

星途 面试题库

面试题:Rust内部可变性:基础示例分析

给定如下Rust代码片段: ```rust struct Counter { value: i32, } impl Counter { fn new() -> Counter { Counter { value: 0 } } fn increment(&self) { // 此处尝试修改value值 self.value += 1; } } ``` 这段代码在编译时会报错,请问如何使用内部可变性相关知识修改代码,使得`increment`方法能够成功增加`value`的值?
20.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 修改结构体定义
    • 使用Cell类型来实现内部可变性。Cell允许在不可变引用上进行修改。
    use std::cell::Cell;
    
    struct Counter {
        value: Cell<i32>,
    }
    
  2. 修改new方法
    • 初始化Cell类型的value
    impl Counter {
        fn new() -> Counter {
            Counter { value: Cell::new(0) }
        }
    }
    
  3. 修改increment方法
    • 使用Cellset方法来修改值。
    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的方式如下:

  1. 修改结构体定义
    use std::cell::RefCell;
    
    struct Counter {
        value: RefCell<i32>,
    }
    
  2. 修改new方法
    impl Counter {
        fn new() -> Counter {
            Counter { value: RefCell::new(0) }
        }
    }
    
  3. 修改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;
    }
}