热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

有没有办法通过Rust中的枚举索引数组?

如何解决《有没有办法通过Rust中的枚举索引数组?》经验,为你挑选了2个好方法。

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

     | 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


推荐阅读
author-avatar
c6643e7f36_253
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有