问题描述
我正在尝试从 Ref 中获取值。
Ref
包含一个枚举 (FeelValue),它有一个包含 f64
的变体 (Number)。 FeelValue 不是 copy
,我不想克隆它。我只想获得对 f64 值的引用,以便与它进行比较。
这是行不通的:
pub enum FeelValue {
Number(f64),Boolean(bool),String(String),// ... many other variants
Null
}
let a: std::cell::Ref<FeelValue> = ...;
let b: std::cell::Ref<FeelValue> = ...;
match (a,b) {
(FeelValue::Number(a_number),FeelValue::Number(b_number)) => FeelValue::Boolean(a_number < b_number),_ => FeelValue::Null
}
我不能做 match (*a,*b)
因为 FeelValue 不是 copy。我可以克隆,但我不想。 (这是排序例程的核心,该例程已经必须克隆所有内容。)
如何从 Ref<FeelValue::Number>
中获取 f64 值?
如果您对我为什么使用 Ref
感到好奇,它来自获得对 Rc<RefCell<Vec<T>>>
中一个值的引用。
解决方法
你可以做match (&*a,&*b)
。
*
将 Ref<T>
取消引用到内部值 T
中,而 &
仅产生对该内部值的引用。