【问题标题】:Invert Rc wrapped boolean反转 Rc 包装的布尔值
【发布时间】:2021-07-16 05:24:08
【问题描述】:

bool 封装在Rc<RefCell<>> 中的正确方法是什么?

use std::{cell::RefCell, rc::Rc};

fn main(){
    let my_wrapped_bool = Rc::from(RefCell::from(true));
    *my_wrapped_bool.borrow_mut() ^= *my_wrapped_bool.borrow();
}

显然我们不能同时借用 mut 和借用,但似乎我们需要某种对内部值的引用才能反转。

thread 'main' panicked at 'already borrowed: BorrowMutError', src/main.rs:5:22

Playground

【问题讨论】:

  • RefCell<bool> 有点“矫枉过正”...Cell<bool> 就足够了。 let my_wrapped_bool = Rc::from(Cell::from(true)); my_wrapped_bool.set(!my_wrapped_bool.get()); 此外,布尔值与自身进行异或不会反转它;它总是将其设置为false

标签: rust


【解决方案1】:

借用方法不能调用两次,但可以重复使用borrow_mut()返回的&mut bool

use std::{cell::RefCell, rc::Rc};

fn main(){
    let my_wrapped_bool = Rc::from(RefCell::from(true));
    
    let mut borrowed_bool = my_wrapped_bool.borrow_mut();
    *borrowed_bool = !*borrowed_bool;
}

编辑:正如其他人指出的那样,将其与自身异或将始终将其设置为 false。

【讨论】:

  • 另外,如评论中所述,这只会将 bool 设置为 false,而不是反转它。要反转它,您需要*borrowed_bool = !*borrowed_bool
  • @user4815162342:或者如果你想变得更漂亮:*borrowed_bool ^= true; 因为bool 实现了BitXorAssign
  • @rodrigo 很高兴注意到 LLVM 生成 identical code for both,就好像 ^= true 被写入一样。
  • 不会*borrowed_bool ^= *borrowed_bool 总是将*borrowed_bool 设置为false
猜你喜欢
  • 2014-06-13
  • 2011-06-03
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 2014-01-20
  • 2019-01-06
相关资源
最近更新 更多