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

How can I use a pattern match to get a reference to an f64 value inside an Rc<Enum::Variant(f64)> without cloning?

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