gpt4 book ai didi

hash - 如何从可哈希的库中创建一个不可哈希的、类 C 的枚举?

转载 作者:行者123 更新时间:2023-11-29 08:19:11 25 4
gpt4 key购买 nike

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

我创建了这个结构,它具有绑定(bind)到 bool 值的键映射,我在以前的 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>
}

然后我收到关于 Key 不可散列的错误。我检查了库,枚举没有派生 Hash 以使其可用作 key 。我四处寻找有关此的建议,但没有得到很多答案;有人建议尝试将枚举包装在一个新的结构类型中,并从那里派生 Hash

所以我尝试添加以下内容:

#[derive(Hash, Eq, PartialEq)]
struct HKey {
key: Key
}

pub struct Input {
held_keys: HashMap<HKey, bool>,
pressed_keys: HashMap<HKey, bool>,
released_keys: HashMap<HKey, bool>
}

但这仍然以这个错误告终,因为我假设它所做的只是混合结构中每个属性的可散列特征。

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 允许的话,我理想情况下希望安全地进行。有人对如何执行此操作有任何建议吗?

I am uploading my progress to GitHub, if you need a bigger picture.

最佳答案

Key enum 是一个类似 C 的枚举(即没有变体有额外的数据),所以我们可以使用 as 将这种类型的枚举转换为整数,例如u32。然后,我们可以引用 u32Hash 实现。

这是一个不使用外部库的最小示例:

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)
}
}

E 没有实现 HashNE 包装了一个 E 并通过将枚举转换为 u32 实现了 Hash,然后使用 u32Hash 实现。

关于hash - 如何从可哈希的库中创建一个不可哈希的、类 C 的枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35140960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com