gpt4 book ai didi

rust - 是否可以将 Rc 映射为 Rc

转载 作者:行者123 更新时间:2023-11-29 07:56:11 25 4
gpt4 key购买 nike

我有一个 Rc<Option<T>>但需要得到一个Rc<T>从中。像这样的东西:

let rc_option: Rc<Option<T>> = Rc::new(Ok(value));
let ok_value: Rc<T> = rc_option.map(|option| option.unwrap());

这有可能吗?这似乎是有意义的,因为 Rc可以只增加它在内部为新映射值设置的计数器,但我找不到它的任何文档。

最佳答案

简答

不,不可能创建 Rc<T>来自 Rc<Option<T>>这使得后者仍然存在。可以创建 Rc<&T>然而,来自 Rc<Option<T>> ,同时仍然保留后一个变量。

长答案

如果您尝试创建一个新的 Rc<T>拥有 TRc<Option<T>>里面, 你将不得不消耗原来的 Rc<Option<T>> .您也不能拥有 Rc<Option<T>> 的多个实例,因为这样你就在指针仍然存在的情况下移动共享值,这是非常不安全的。

但是有一种方法可以安全地做到这一点!使用 Rc::try_unwrap ,您可以尝试将值移出,但如果原始 Rc 的多个实例,这将返回错误存在。请记住,您还必须处理 Option<T> 的情况。最终成为 None .

这是一个例子:

let rc_option: Rc<Option<T>> = Rc::new(Some(value));

match Rc::try_unwrap(rc_option) {
Ok(option) => {
match option {
Some(t) => {
let ok_value: Rc<T> = Rc::new(t);
// Do something with ok_value
}
None => {
// Do something else here
}
}
}
Err(rc_option) => {
// There are multiple owners, do something else here
}
}

如果你想保留原件,你可以这样做:

match &*rc_option {
Some(ref t) => {
let ok_ref: Rc<&T> = Rc::new(t);
}
None => { /* Do something else, there's no internal value */ }
}

编辑:如 Chronial 所述,请注意 ok_ref活不过rc_option (因为它是对 rc_option 的引用),这可能不是您想要发生的。

关于rust - 是否可以将 Rc<T> 映射为 Rc<Subpart-of-T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54208397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com