为什么在where子句中存在特征绑定,而在函数签名中却没有?

时间:2018-12-22 12:08:55

标签: syntax rust

我正在阅读HashMap's get function,但是在源代码中找不到类型参数K

为什么K子句中存在where特质绑定,而函数签名中却没有?

pub fn get<Q: ?Sized>(&self, k: &Q) -> Option<&V>
    where K: Borrow<Q>,
          Q: Hash + Eq
{
    self.search(k).map(|bucket| bucket.into_refs().1)
}

2 个答案:

答案 0 :(得分:5)

mvK的类型参数,并已引入at the beginning of the applicable impl block

HashMap<K, V, S>

它适用于整个块,包括get,它增加了一个附加约束impl<K, V, S> HashMap<K, V, S> where K: Eq + Hash, S: BuildHasher

这种指定K: Borrow<Q>的{​​{1}}类型的方法可能有点笨拙,但是它使我们能够例如请执行以下操作:

get

答案 1 :(得分:0)

我认为search方法主体中的get方法使用K: Borrow<Q>特征范围,因此get方法需要相同的特征范围。
关于在获取方法参数中使用&str&String作为键值,
仅使用&Q类型