【发布时间】:2020-05-14 22:14:29
【问题描述】:
我有以下结构:
struct Inner;
enum State {
A(Inner),
B,
}
struct Owner {
state: Rc<RefCell<State>>,
}
我想提供如下接口:
impl Owner {
fn a(&self) -> Option<Ref<'_, Inner>>;
}
owner.a() 将返回的位置:
- 当
owner.state匹配State::A(s),然后Some([some ref to s])(这会增加owner.state的强计数并在丢弃时减少它,同时保证RefCell借用属性); - 否则,
None。
这有可能吗?我试过查看Ref::map,但似乎无法使其与Rc<RefCell<_>> 和Option 一起使用。
我现在正在做的解决方法是:
impl Owner {
fn with_a(&self, mut callback: impl FnMut(&Inner)) {
match *self.state.borrow() {
State::A(ref inner) => callback(inner),
_ => {}
}
}
}
【问题讨论】:
-
您提到想要增加 Rc 的计数,但
fn a(&self) -> Option<Ref<'_, Inner>>;无论如何都会将 ref 的生命周期与 Rc 绑定,因此无需增加计数。如果您发布的函数签名更符合您的要求,play.rust-lang.org/… 将起作用。 -
@loganfsmyth 我错过了
unreachable!部分,谢谢!
标签: rust reference borrow-checker reference-counting borrowing