在HashMap上实现一个使用带边界的方法的特征

时间:2015-07-17 07:11:56

标签: rust

我想在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语句中添加相同的边界,这些边界存在于这些方法中。我该如何修复此代码?

Playground

1 个答案:

答案 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 typeusize

对应于这一行:

V

您要在此处尝试将let id = self.len() as V; 强制转换为usize实例化的类型。这通常无效,因为V实际上可能与V不兼容(例如usize或任何其他结构)。由于您实际需要的是Vec从某个键到ID,因此您只需删除所有HashMap泛型并直接设置V的值参数:

HashMap