为什么输入需要拥有密钥的所有权?

4

entry的声明如下:

pub fn entry(&mut self, key: K) -> Entry<'_, K, V>  // key is move into entry

相比之下,get 方法的代码如下:

pub fn get<Q: ?Sized>(&self, k: &Q) -> Option<&V> where  // k is just a shared reference
    K: Borrow<Q>,
    Q: Hash + Eq, 
Entry 接口包含了 keyor_insert_with_key 方法, 但这两种方法都只需要一个对 key 的引用,那么为什么 entry 需要拥有 key 的所有权,而 get 却不需要呢?
换句话说,Entry 获取 key 所有权提供了什么功能?如果所有的功能都可以通过共享引用来实现,那么我会认为需要所有权是不必要的。
1个回答

3

我发帖之后就想到了答案:我忘记使用insert方法。

pub fn insert(&mut self, k: K, v: V) -> Option<V>

因此,像or_insert这样的方法需要拥有key的所有权才能调用insert


这带来了另一个问题:为什么HashMap需要拥有key的所有权?既然它只需要key的哈希值,那么共享引用不就足够了吗?虽然我认为我应该提出单独的问题来解决这个问题。


1
HashMap 需要拥有一个 K,因为键可以具有相同的哈希值,但仍需要区分它们。 - kmdreko
@kmdreko 那很有道理!我认为当使用成本高昂的不可变结构时,采用对其键和/或值进行引用的RefHashMap也可能会有所帮助。 - nalzok
3
如果你想要的话,可以使用HashMap<&Key, &Value> - kmdreko
虽然这可能是哈希映射为了解决冲突而按顺序存储键的结果,但哈希映射确实存储键并返回(对它们的引用)(例如默认迭代器、keysget_key_value)。 - Masklinn
@Masklinn 这是真的,但是即使哈希映射不拥有键(例如通过接受键的引用在insert中),它们仍然可以返回对键的引用。 - nalzok
只有通过存储引用,才能更复杂、不太方便地存储密钥。 - Masklinn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接