首页 > 解决方案 > 如何表示一个可以是 Rc 的字段或弱

问题描述

我想在结构中有一个字段,如下所示:

struct Foo<T> {
    bar: Smart<T>
}

其中 bar 可以是Rc<TWeak<T>,具体取决于 Foo 的不同实例之间的“所有权关系”。除了创建自定义枚举之外,Rust 中是否有任何惯用的方法来做到这一点?

标签: rust

解决方案


这种结构通常被称为“Either”,并且有一个看起来可以解决一些常见用例的板条箱:https ://docs.rs/either/1.5.3/either/

然后你可以写

struct Foo<T> {
    bar: Either<Weak<T>, Rc<T>>
}

那么一个获取 an 的示例函数Option<Rc<T>>可能是:

impl <T> Foo<T> {
  fn get_rc(self) -> Option<Rc<T>> {
     self.bar
       .map_left( |weak| weak.upgrade() )
       .map_right( |v| Some(v) )
       .into_inner()
  }
}

然后可以这样使用:

fn main() {
    let x = Rc::new(1);
    let f_direct = Foo{ bar:Either::Right(x.clone()) };
    println!("f_direct.get_rc() = {:?}", f_direct.get_rc());
    let f_weak = Foo{ bar:Either::Left(Rc::downgrade(&x)) };
    println!("f_weak.get_rc() = {:?}", f_weak.get_rc());
}

链接到操场上的完整示例:

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=c20faaa46277550e16a3d3b24f3d1750


推荐阅读