如何使用模式匹配在不克隆的情况下获取对 Rc<Enum::Variant(f64)> 中 f64 值的引用?

问题描述

我正在尝试从 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 中,而 & 仅产生对该内部值的引用。