Hash 如何使库中的类C的非散列枚举可散列?
通过在SFML中制作一个小的吃豆人克隆游戏(使用RSFML),我正在学习如何使用Rust,但在映射枚举时遇到了一个问题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
我创建了一个结构图,它有键链接到布尔代数,在以前的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)
}
}