我如何接受带有任何散列算法的RustHashMap?

我正在开发一个具有函数的库,我希望能够接受任何散列算法的 HashMap。但是当我尝试使用特定类型的 HashMap(例如 FnvHashMap)调用它时,编译器会抱怨。

pub fn func(map: HashMap<u32, u32>) {}

let map: FnvHashMap<u32, u32> = FnvHashMap::default();
func(map);
error[E0308]: mismatched types
  --> lib.rs:42:10
   |
42 |     func(map);
   |          ^^^ expected struct `RandomState`, found struct `BuildHasherDefault`
   |
   = note: expected struct `HashMap<_, _, RandomState>`
              found struct `HashMap<_, _, BuildHasherDefault<FnvHasher>>`

由于FnvHashMap只是一个类型别名,我认为这不会成为问题。

我确定有办法做到这一点,但我还没有找到。正确的方法是什么?

回答

HashMap 文档中的定义是:

pub struct HashMap<K, V, S = RandomState> { /* fields omitted */ }

RandomState是默认类型,但它可以被另一种类型覆盖,包括泛型。它可能不是立即清除,但大多数的HashMap方法在声明的impl块是约束S: BuildHasher,这是你需要的约束它的特点:

use std::hash::BuildHasher;

pub fn func<S: BuildHasher>(map: HashMap<u32, u32, S>) {}


以上是我如何接受带有任何散列算法的RustHashMap?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>