ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
Cell和RefCell都在std::cell模块里。 Cell是一个包含一个类型为T的私有值的结构体。唯一特殊的地方是你可以对一个不可变的Cell类型调用get和set方法修改它的值。 Cell::new(value)创建一个cell类型值,移动value到它内部。 cell.get()返回一个值的拷贝。 cell.set(value)存一个新的值进去,已存在的值丢弃掉。这个方法的self参数是一个不可变引用&self。它是对不可变规则的一点点安全的篡改。 Cell不允许你在共享引用上调用可变方法,.get()方法返回的是值的拷贝,所以它要求泛型参数T是拷贝类型。 RefCell和Cell相似,也是一个包含单个值的泛型结构体。和Cell不同的是,RefCell支持借用值的引用。 RefCell::new(value)创建一个RefCell类型的值,把value移动到内部。 ref\_cell.borrow()返回Ref,是内部值的共享引用。 ref\_cell.borrow\_mut()返回RefMut,是内部值的可变引用。如果内部值已经被借用了,那么这个方法会触发恐慌。 这两个方法在你破坏可变引用的独占性的时候会恐慌。 为了避免恐慌,你应该在不同的块里面调用它们。 这有点儿像正常引用的工作方式,唯一的不同是正常引用的规则检查在编译期间,而RefCell的规则检查在运行时,所以运行时检查到你在破坏规则的话就只能触发恐慌了。 对.get(),.set(),.borrow(),.borrow\_mut()的使用有一些难度,但是这是破坏不可变独占性规则的一点点儿代价,还有一个缺点,对cell或者包含它们的类型的使用是线程不安全的,rust不允许在多线程中同时使用它们。