我有一个枚举,我必须在其中执行模式匹配.但由于我在堆栈内存有限(<4KB)的VM上运行该程序,所以我在堆上使用Box来分配枚举.但在执行模式匹配时,我必须取消对它的引用,这会导致它被分配到堆栈上,而这是我不需要的.是否可以对已装箱的值执行模式匹配?

我想要实现如下所示.

pub enum MyEnum {
  A,
  B,
}

let a = Box::new(MyEnum::A);
let value = match a {
  MyEnum::A => 1,
  MyEnum::B => 2 
}

这就是我得到的错误

error[E0308]: mismatched types
   --> src/entrypoint.rs:119:9
    |
118 |     match a {
    |           ---
    |           |
    |           this expression has type `Box<MyEnum>`
    |           help: consider dereferencing the boxed value: `*a`
119 |         MyEnum::A => 1,
    |         ^^^^^^^^^^^^^^^ expected struct `Box`, found enum `MyEnum`
    |
    = note: expected struct `Box<MyEnum>`
                 found enum `MyEnum`

我try 按照编译器的建议取消对它的引用,但由于在取消引用时它是在堆栈上分配的,所以我无法使用它.我希望在不取消引用的情况下匹配枚举.

推荐答案

您也可以匹配引用.这将简单地重新borrow 已装箱的值,并在堆栈上最多分配一个指针.

pub enum MyEnum {
  A,
  B,
}

let a = Box::new(MyEnum::A);
let value = match &*a {
  &MyEnum::A => 1,
  &MyEnum::B => 2 
};

Rust相关问答推荐

如何将元素添加到向量并返回对该元素的引用?

访问Rust中的隐藏变量

如何在原始字符串中转义";#和#";

当rust中不存在文件或目录时,std::FS::File::Create().unwire()会抛出错误

在Rust中,如果Result是Err,运行副作用(如日志(log)记录)的惯用方法是什么

防止cargo test 中的竞争条件

如何删除Mac Tauri上的停靠图标?

如何计算迭代器适配器链中过滤的元素的数量

Pin<;&;mut可能将Uninit<;T>;>;合并为Pin<;&;mut T>;

我可以在不收集或克隆的情况下,将一个带有Item=(key,val)的迭代器拆分成单独的key iter和val iter吗?

`Pin`有没有不涉及不安全代码的目的?

如何执行数组文字的编译时串联?

当推送到 HashMap 中的 Vector 时,类型 `()` 无法取消引用

如何获取模块树?

Rust中的位移操作对范围有什么影响?

decltype、dyn、impl traits,重构时如何声明函数的返回类型

如何在 Rust 中按 char 对字符串向量进行排序?

如何在 Rust 中创建最后一个元素是可变长度数组的 struct ?

如何在 C++ 和 Rust 之间共享 pthread 同步原语?

匹配结果时的简洁日志(log)记录