是否有可以窃取数据的共享指针?

时间:2017-08-14 13:21:20

标签: rust

我想在其他几个结构之间共享一个结构Foo 能够提取这些数据。此结构的所有其他持有者将看到该值消失。

伪代码:

if boo.ref_to_foo.is_valid() {
   let foo: Foo = boo.ref_to_foo.steal(); //1
} else {
   //after executing 1 one time all come here 
}

我不需要多线程。

Rc<RefCell<Foo>>我想要的是什么? Deref for Rc + RefCell::borrow_mut + Option::take,或者是一种更简单的方式来实现我想要的目标?

1 个答案:

答案 0 :(得分:4)

  

是否有可以窃取数据的共享指针?

不,但您拥有创建一个所需的所有构建块。你自己

  • 想要更改该值,您需要RefCell提供的内部可变性
  • 想要分享所有权,您需要Rc
  • 想要拥有值或不值的可能性,您需要Option
use std::rc::Rc;
use std::cell::RefCell;

struct Foo;

fn main() {
    let foo1 = Rc::new(RefCell::new(Some(Foo)));
    let foo2 = foo1.clone();

    if foo1.borrow().is_some() {
        let stolen = foo1.borrow_mut().take();
    } else {
        println!("Already stolen!")
    }

    if foo2.borrow().is_some() {
        let stolen = foo2.borrow_mut().take();
    } else {
        println!("Already stolen!")
    }
}

如果您愿意,可以将所有这些包装成单一类型。

另见: