我在从 RefCell<Option<Rc>> 获取引用时遇到问题。
有什么建议吗?
struct Node<T> {
value: T
}
struct Consumer3<T> {
tail: RefCell<Option<Rc<Node<T>>>>,
}
impl<T> Consumer3<T> {
fn read<'s>(&'s self) -> Ref<Option<T>> {
Ref::map(self.tail.borrow(), |f| {
f.map(|s| {
let v = s.as_ref();
v.value
})
})
}
}
Run Code Online (Sandbox Code Playgroud)
给出:
struct Node<T> {
value: T
}
struct Consumer3<T> {
tail: RefCell<Option<Rc<Node<T>>>>,
}
impl<T> Consumer3<T> {
fn read<'s>(&'s self) -> Ref<Option<T>> {
Ref::map(self.tail.borrow(), |f| {
f.map(|s| {
let v = s.as_ref();
v.value
})
})
}
}
Run Code Online (Sandbox Code Playgroud)
从一个映射Ref
到另一个要求目标已经存在于内存中的某处。所以你不能Ref<Option<T>>
从 a得到 a ,因为内存中RefCell<Option<Rc<Node<T>>>>
没有任何地方。Option<T>
然而,如果Option
是Some
,那么内存中就会有一个T
,您可以从中获取Ref<T>
; 如果Option
是None
,显然你不能。因此,返回Option<Ref<T>>
对您来说可能是一个可行的选择:
use std::{cell::{Ref, RefCell}, rc::Rc};
struct Node<T> {
value: T
}
struct Consumer3<T> {
tail: RefCell<Option<Rc<Node<T>>>>,
}
impl<T> Consumer3<T> {
fn read(&self) -> Option<Ref<T>> {
let tail = self.tail.borrow();
if tail.is_some() {
Some(Ref::map(tail, |tail| {
let node = tail.as_deref().unwrap();
&node.value
}))
} else {
None
}
}
}
Run Code Online (Sandbox Code Playgroud)
游乐场。
归档时间: |
|
查看次数: |
754 次 |
最近记录: |