我想表示内存中的数据表,如下所示:

     | USD | EUR |
-----+-----+-----+
John | 100 | 50  |
-----+-----+-----+
Tom  | 300 | 200 |
-----+-----+-----+
Nick | 200 | 0   |
-----+-----+-----+

有一组已知的人,每个人都拥有一些货币.

我有以下列举:

enum Person {
    John,
    Tom,
    Nick
}

enum Currency {
    USD,
    EUR
}

我想将这些数据编码为2D数组,如果能够将数组元素的索引不是按usize而是按enum,那就太酷了.例如.:

data[Person::John][Currency::USD] = 100;

是否可以使用Rust中的数组和枚举?或者是否有其他数据 struct 可用于此目的?

我知道HashMap,但这不是我想要的,因为:

  • HashMap在堆上工作(这使得它比常规堆栈分配数组慢得多)

  • HashMap不能保证物品的存在.例如,每次我想得到一些东西,我必须打开它并处理None箱,这与使用普通数组相比不是很方便.

这与How do I match enum values with an integer?不同,因为我对将enum转换为usize不感兴趣;我只想要一种通过枚举访问数组/映射项的简便方法.

推荐答案

ljedrz提供了一个很好的解决方案.

将以下内容添加到您的Cargo.toml:

[dependencies]
enum-map = "*"
enum-map-derive = "*"

然后,在src/main.rs:

extern crate enum_map;
#[macro_use] extern crate enum_map_derive;

#[derive(Debug, EnumMap)]
enum Person { John, Tom, Nick }

#[derive(Debug, EnumMap)]
enum Currency { USD, EUR }

use enum_map::EnumMap;
use Person::*;
use Currency::*;

fn main() {
    // Create 2D EnumMap populated with f64::default(), which is 0.0
    let mut table : EnumMap<Person, EnumMap<Currency, f64>> = EnumMap::default();

    table[John][EUR] = 15.25;

    println!("table = {:?}", table);
    println!("table[John][EUR] = {:?}", table[John][EUR]);
}

输出:

table = EnumMap { array: [EnumMap { array: [0, 15.25] }, EnumMap { array: [0, 0] }, EnumMap { array: [0, 0] }] }
table[John][EUR] = 15.25

Rust相关问答推荐

两个相关特征的冲突实现错误

使用 struct 外部的属性来改变 struct 的原始方式

什么时候铁 rust FFI边界上的panic 是未定义的行为?

如何提高自定义迭代器的`extend`性能

在Rust中显式装箱受生存期限制的转换闭包

关于 map 闭合求和的问题

将Vec<;U8&>转换为Vec<;{Float}&>

不同类型泛型的映射

将特征与具有生命周期的关联类型一起使用时的生命周期方差问题

详尽的匹配模式绑定

如何在 Rust 中将函数项变成函数指针

Google chrome 和 Apple M1 中的计算着色器

在Rust中实现Trie数据 struct 的更好方式

pyO3 和 Panics

如何在 Rust 的 Hyper 异步闭包中从外部范围正确读取字符串值

为什么我可以同时传递可变和不可变引用?

为什么 no_std crate 可以依赖于使用 std 的 crate?

如何获取包裹在 Arc<> 和 RwLock<> 中的 Rust HashMap<> 的长度?

有没有办法阻止 rust-analyzer 使非活动代码变暗?

这个 match 语句的默认值应该是什么,还有一种方法可以解开 Some case (chess in rust)