我想在HashMaps上实现以下特性:
trait IdAssigner<K, V> {
// If key has already been seen, returns (id_for_key, false). Otherwise
// assigns a new id_for_key (starting with 0 and increasing) and returns
// (id_for_key, true).
fn assign_id(mut self, key: K) -> (V, bool);
}
impl<K, V> IdAssigner<K, V> for HashMap<K, V> where V: Add<V> {
fn assign_id(mut self, key: K) -> (V, bool) {
if self.contains_key(&key) {
(self[&key], false)
} else {
let id = self.len() as V;
self[&key] = id;
(id, true)
}
}
}
编译器给出了我想在HashMap实现中调用的方法的各种错误。我怀疑我需要在我的impl语句中添加相同的边界,这些边界存在于这些方法中。我该如何修复此代码?
答案 0 :(得分:1)
错误:没有为类型
找到名为contains_key
的方法
正如您在contains_key
的文档中所看到的,定义impl
的{{1}}块的边界为contains_key
。将K的绑定添加到where子句也将修复其他where K: Eq + Hash, S: HashState
错误和no method
std :: collections :: hash :: map :: HashMap`错误。
之后你会得到
错误:非标量演员:
cannot index a value of type
为usize
对应于这一行:
V
您要在此处尝试将let id = self.len() as V;
强制转换为usize
实例化的类型。这通常无效,因为V
实际上可能与V
不兼容(例如usize
或任何其他结构)。由于您实际需要的是Vec
从某个键到ID,因此您只需删除所有HashMap
泛型并直接设置V
的值参数:
HashMap