rust - 如何表示一个可以是 Rc 的字段或弱
问题描述
我想在结构中有一个字段,如下所示:
struct Foo<T> {
bar: Smart<T>
}
其中 bar 可以是Rc<T
或Weak<T>
,具体取决于 Foo 的不同实例之间的“所有权关系”。除了创建自定义枚举之外,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());
}
链接到操场上的完整示例:
推荐阅读
- sonarqube - Sonar Qube 代码分析失败,存在代码 1
- react-native - 选项卡导航 - URL 而不是组件
- python - 我正在尝试定义 LSTM 并收到错误“TypeError: add() missing 1 required positional argument: 'layer'”
- android - 如何解决 android 上 termux 应用程序中的代码服务器运行时错误?
- python - 如何按周拆分并按代理获取计数?
- c - GCC 忽略 __attribute__((section("CCMRAM")))。怎么修?
- java - 正则表达式查找 Java 集合声明
- java - 通过 NTLMv2 和 Kerberos 进行静默代理身份验证
- windows - Visual Studio 和 Anaconda 终端错误
- typescript - TypeORM 在创建表后插入基本主数据(类型、状态、..)