Hash 如何使库中的类C的非散列枚举可散列?

Hash 如何使库中的类C的非散列枚举可散列?,hash,enums,hashmap,rust,Hash,Enums,Hashmap,Rust,通过在SFML中制作一个小的吃豆人克隆游戏(使用RSFML),我正在学习如何使用Rust,但在映射枚举时遇到了一个问题 我创建了一个结构图,它有键链接到布尔代数,在以前的C++项目中使用过,所以我只是想复制它。 use sfml::window::keyboard::Key; use std::collections::HashMap; pub struct Input { held_keys: HashMap<Key, bool>, pressed_keys: H

通过在SFML中制作一个小的吃豆人克隆游戏(使用RSFML),我正在学习如何使用Rust,但在映射枚举时遇到了一个问题

我创建了一个结构图,它有键链接到布尔代数,在以前的C++项目中使用过,所以我只是想复制它。

use sfml::window::keyboard::Key;
use std::collections::HashMap;

pub struct Input {
    held_keys: HashMap<Key, bool>,
    pressed_keys: HashMap<Key, bool>,
    released_keys: HashMap<Key, bool>
}
但最终还是出现了这个错误,因为我假设它所做的只是混合结构中每个属性的hashable特性

the trait `core::hash::Hash` is not implemented for the type `sfml::window::keyboard::Key`
    key: Key
    ^~~~~~~~
in this expansion of #[derive_Hash] (defined in src/input.rs)
help: run `rustc --explain E0277` to see a detailed explanation
note: required by `core::hash::Hash::hash`
我现在猜我需要尝试手动将
Hash
trait实现添加到我创建的新
HKey
结构中,但我不知道如何从枚举生成哈希,因为将其转换为int似乎不容易。如果Rust允许的话,我希望安全地执行此操作。有人对如何做到这一点有什么建议吗

枚举是一个类似C的枚举(即,没有任何变量具有附加数据),因此我们可以使用
as
将此类型的枚举转换为整数,例如
u32
。然后,我们可以按照
u32
Hash
实现

下面是一个不使用外部库的示例:

use std::hash::{Hash, Hasher};

#[derive(Copy, Clone)]
enum E {
    A, B, C
}

struct NE(E);

impl Hash for NE {
    fn hash<H>(&self, state: &mut H) where H: Hasher {
        (self.0 as u32).hash(state)
    }
}
使用std::hash::{hash,Hasher};
#[衍生(复制、克隆)]
枚举E{
A、 B,C
}
结构NE(E);
网元的impl哈希{
fn散列(&self,state:&mut H),其中H:Hasher{
(self.0作为u32.hash(状态)
}
}

E
不实现
Hash
NE
包装一个
E
并通过将枚举转换为
u32
,然后使用
u32
实现
Hash

@Shepmaster来实现
Hash
,然后你哭了。谢谢弗朗西斯。我不知道您可以将枚举转换为“as”。我成功地在代码中实现了它,没有任何问题。
use std::hash::{Hash, Hasher};

#[derive(Copy, Clone)]
enum E {
    A, B, C
}

struct NE(E);

impl Hash for NE {
    fn hash<H>(&self, state: &mut H) where H: Hasher {
        (self.0 as u32).hash(state)
    }
}