我如何接受具有任何哈希算法的 Rust HashMap?
How can I accept a Rust HashMap with any hashing algorithm?
我正在开发一个库,该库具有我希望能够接受任何哈希算法的 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
in the docs的定义是:
pub struct HashMap<K, V, S = RandomState> { /* fields omitted */ }
RandomState
是默认类型,但可以用其他类型覆盖它,包括泛型。可能不是很清楚,但是大多数 HashMap
方法都在 an impl
block 中声明,约束 S: BuildHasher
,这是你需要绑定它的特征:
use std::hash::BuildHasher;
pub fn func<S: BuildHasher>(map: HashMap<u32, u32, S>) {}
我正在开发一个库,该库具有我希望能够接受任何哈希算法的 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
in the docs的定义是:
pub struct HashMap<K, V, S = RandomState> { /* fields omitted */ }
RandomState
是默认类型,但可以用其他类型覆盖它,包括泛型。可能不是很清楚,但是大多数 HashMap
方法都在 an impl
block 中声明,约束 S: BuildHasher
,这是你需要绑定它的特征:
use std::hash::BuildHasher;
pub fn func<S: BuildHasher>(map: HashMap<u32, u32, S>) {}