gpt4 book ai didi

arrays - 有没有办法在 Rust 中通过枚举索引数组?

转载 作者:行者123 更新时间:2023-11-29 07:45:08 26 4
gpt4 key购买 nike

我想在内存中表示一个数据表,如下所示:

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

有一组已知的人,他们每个人都拥有一些货币。

我有以下枚举:

enum Person {
John,
Tom,
Nick
}

enum Currency {
USD,
EUR
}

我想将此数据编码为二维数组,如果能够不通过 usize 而是通过 enum 来索引数组元素,那就太棒了。例如:

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

可以在 Rust 中处理数组和枚举吗?或者是否有任何其他数据结构可以用于此目的?

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

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

  • HashMap 无法保证项目存在。例如。每次我想得到一些东西时,我都必须打开它并处理 None 的情况,与使用普通数组相比,这不是很方便。

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

最佳答案

ljedrz 提供了一个很好的解决方案。解决该问题的另一种方法是使用现有的 crate enum-map .

将以下内容添加到您的 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

关于arrays - 有没有办法在 Rust 中通过枚举索引数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44900810/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com