作者:c6643e7f36_253 | 来源:互联网 | 2023-01-30 15:40
我想在内存中表示一个数据表,如下所示:
| 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中的数组和枚举?或者是否有任何其他数据结构可以为此服务?
我知道HashMap
,但这不是我想要的,因为:
HashMap
在堆上工作(这使得它比常规堆栈分配的数组慢得多)
HashMap
我不能保证项目存在.例如,每次我想得到的东西,我必须解开它并处理None
案例,与普通数组的使用相比,这不是很方便.
这与我如何将枚举值与整数匹配不同?因为我对转换enum不感兴趣usize
; 我只想通过枚举方便地访问数组/地图项.
1> ljedrz..:
如果您需要使用数组实现它,这并不像看起来那么简单.
为了能够在数组中包含这两条信息(能够通过它们进行索引),首先需要将它们组合在一个类型中,例如在结构中:
struct Money([(Currency, usize); 2]);
struct PersonFinances {
person: Person,
money: Money
}
然后,如果您希望能够为表索引,则需要将其包装在您自己的类型中,以便您可以Index
为其实现特征:
use std::ops::Index;
struct Table([PersonFinances; 3]);
impl Index<(Person, Currency)> for Table {
type Output = usize;
fn index(&self, idx: (Person, Currency)) -> &Self::Output {
&self
.0
.iter()
.find(|&pf| pf.person == idx.0) // find the given Person
.expect("given Person not found!")
.money
.0
.iter()
.find(|&m| m.0 == idx.1) // find the given Currency
.expect("given Currency not found!")
.1
}
}
然后你可以Table
用a Person
,Currency
对索引:
table[(Tom, EUR)]
Rust操场链接到整个代码
2> Sergey Potap..:
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> = 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