HashMap::entry的签名是:

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

好的,看起来不错.我想从HashMap中获取一个键为K的条目,所以我当然需要给它一个K.

然而,HashMap:get的签名是:

pub fn get<Q>(&self, k: &Q) -> Option<&V>
where
    K: Borrow<Q>,
    Q: Hash + Eq + ?Sized,

现在我完全糊涂了.这个复杂的约束是怎么回事?为什么不是K&K呢?

推荐答案

当您使用entry时,您将获得一个空闲条目或一个已占用条目.如果条目是空的,并且您希望调用某些函数(如or_insert),则需要实际的键,而不是对它的引用,因为此时您将插入到映射中.请注意,我们不知道密钥是否支持CopyClone,因此我们不能采用引用并克隆它.

但是,当您使用get时,您不需要插入实际值.只使用一个引用就可以计算HashEq,这是确定键是否在映射中所必需的.如果密钥很大,这会更有效率,并且可以避免不必要的分配.

此外,get还允许您使用实现Borrow的任何内容作为密钥.因此,如果您的密钥是String,则可以使用&strget.这很棒,因为您的密钥可能是拥有的,但您希望使用&str字面值,如"foo"来在 map 中进行查找.在这种情况下,根本不需要分配,因为字符串是在程序代码中硬编码的.

Rust相关问答推荐

程序退出后只写入指定管道的数据

访问Rust中的隐藏变量

抽象RUST中的可变/不可变引用

为什么reqwest以文本形式下载二进制文件?

防止cargo test 中的竞争条件

如何点击()迭代器?

为什么基于高山Linux的Docker镜像不能在绝对路径下找到要执行的命令?

避免在Collect()上进行涡鱼类型的涂抹,以产生<;Vec<;_>;,_>;

在Rust 中移动原始指针的靶子安全吗

如何在Rust中基于字符串 Select struct ?

使用 serde::from_value 反序列化为泛型类型

存储返回 impl Trait 作为特征对象的函数

我可以禁用发布模式的开发依赖功能吗?

Rust 中指向自身的引用如何工作?

为什么Rust编译器会忽略模板参数应具有静态生命周期?

Rust 引用元组和引用元组

`map` 调用在这里有什么用吗?

如何在 Rust 中创建最后一个元素是可变长度数组的 struct ?

制作嵌套迭代器的迭代器

为什么这个 Trait 无效?以及改用什么签名?