gpt4 book ai didi

rust - 如何将 std::hash::Hasher 放入 Box 中?

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

我有一个看起来像这样的数据结构:

pub struct X<K> {
hasher: Box<std::hash::Hasher>,
phantom: std::marker::PhantomData<K>,
}

它的用法如下:

impl<K: std::hash::Hash> Trait<K> for X<K> {
fn function(&mut self, key: &K) -> usize {
...
key.hash(&mut *self.hasher);
...
}
}

我在夜间收到以下编译器错误:

The trait std::hash::Hasher is not implemented for std::boxed::Box<std::hash::Hasher + 'static>

另一种方法是使用 key.hash(self.hasher.deref_mut()) ,这会触发以下错误:

std::hash::Hasher + 'static does not have a constant size known at compile-time

这两个错误都在 hash 中称呼。我觉得很奇怪 std::hash::Hasher未针对 Box 实现,但我想知道这是否不是为了保护我自己而做的事情。除此之外,deref_mut 似乎很奇怪考虑到 Box,错误提示编译时已知的大小应该是固定大小的结构。

我知道解决这个问题的方法是使用模板参数,但自从 X 之后我就避免了这个问题将用于不需要该参数的其他数据结构,这意味着我将不得不传递一个不必要的参数。这似乎是HashMap采取的方法,因为它使用 RandomState模板参数,但我希望尽可能避免这种情况。

最佳答案

I find it strange that std::hash::Hasher is not implemented for Box

我假设你的意思是 Box<T> where T: std::hash::Hasher .我不知道为什么没有实现,但可能只是因为还没有人实现。

it seems weird that the deref_mut error complains about size known at compile time

问题是泛型类型 H有隐含的 Sized绑定(bind)(默认情况下一切都做):

fn hash<H>(&self, state: &mut H)
where
H: Hasher;

你需要它说:

fn hash<H>(&self, state: &mut H)
where
H: ?Sized + Hasher;

同样,我看不出有任何理由不能更改它来执行此操作,很可能没有人需要它。


您可以添加一个新类型来解决这个问题:

use std::hash;

pub struct X<K> {
hasher: BoxedHasher,
phantom: std::marker::PhantomData<K>,
}

struct BoxedHasher(Box<hash::Hasher>);

impl hash::Hasher for BoxedHasher {
fn finish(&self) -> u64 {
self.0.finish()
}

fn write(&mut self, bytes: &[u8]) {
self.0.write(bytes)
}
}

impl<K> X<K>
where
K: hash::Hash,
{
fn function(&mut self, key: &K) -> usize {
key.hash(&mut self.hasher);
0
}
}

关于rust - 如何将 std::hash::Hasher 放入 Box 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45289078/

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