Rust 在索引时是否隐式创建映射条目,例如C++

Does Rust implicitly create map entries when indexing, like C++?

本文关键字:映射 C++ 例如 创建 索引 是否 Rust      更新时间:2023-10-16

C++索引运算符是为std::mapstd::unordered_map定义的,因此,如果您对容器的引用是非常量的,则不分配的索引行为就足以在容器内隐式创建一个值。这有时会产生微妙的错误,您希望引用容器中的值,但实际上创建一个,例如 config["stting"]而不是config["setting"].

我知道 Python 通过让__setitem____getitem__是单独的方法来解决这个问题,但这需要与解析器合作。

Rust 会做些什么来解决这个常见的错误来源吗?

No Rust 没有这个问题。在 Rust 集合中没有隐式创建项目。

例如,您将一个键值对插入到带有map.insert(key, value)std::collections::HashMap,并使用 let value = map.get(key); 检索值。

请注意,.get()将返回一个Option<&V>,因此如果密钥不存在,您将因此获得None

Rust 还提供了一种简单的方法来检索值或为给定键插入一些默认值(如果该值不存在(:

let value = map.entry(key).or_insert(0);

 

HashMap 还实现了 Index 特征,它允许使用 let value = map[key]; 检索值,如果map中不存在key,它将恐慌。

请注意,由于HashMap不实现IndexMut,因此此[ ]括号语法始终返回对值的不可变引用,因此不能以这种方式插入或修改值。