キーをすべてAnimal
の値から取るのであればstd::mem::discriminantが使えると思います。
他の手段としてはenum AnimalKind { Dog, Cat, Bird }
とAnimal::kind: fn(&self) -> AnimalKind
を作るという方法でしょうか。AnimalKind
についてはenum-mapというクレートを使えば扱いやすくなり、パフォーマンスも向上するかと思います。(直接Animalには使えないので注意)
diff
1-use std::collections::HashMap;
2+use std::{
3+ collections::HashMap,
4+ mem::{self, Discriminant},
5+};
6
7 #[derive(Debug, Hash, Eq, PartialEq)]
8 enum Animal {
9 Dog,
10 Cat(i32),
11 Bird { name: String, age: i32 },
12 }
13
14 fn main() {
15 // やりたいこと
16- let foo: HashMap<Animal, i32> = vec![(Animal::Dog, 3), (Animal::Cat, 2), (Animal::Bird, 1)]
17- .into_iter()
18- .collect();
19+ let foo: HashMap<Discriminant<Animal>, i32> = vec![
20+ (mem::discriminant(&Animal::Dog), 3),
21+ (mem::discriminant(&Animal::Cat(0)), 2),
22+ (
23+ mem::discriminant(&Animal::Bird {
24+ name: "".to_owned(),
25+ age: 0,
26+ }),
27+ 1,
28+ ),
29+ ]
30+ .into_iter()
31+ .collect();
32 let bar = Animal::Cat(10);
33- assert_eq!(2, foo[&bar])
34+ assert_eq!(2, foo[&mem::discriminant(&bar)])
35 }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。