Rust 在索引时是否隐式创建映射条目,例如C++
Does Rust implicitly create map entries when indexing, like C++?
C++索引运算符是为std::map
和std::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
,因此此[ ]
括号语法始终返回对值的不可变引用,因此不能以这种方式插入或修改值。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 将函数类成员映射到类本身内部
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 使用std::函数映射对象方法
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++映射分割错误(核心转储)
- 内联映射初始化的动态atexit析构函数崩溃
- 使用"std::unordereded_map"映射到"std::list"对象
- 如何从多映射中删除特定的重复项
- 在未初始化映射的情况下,将值插入到映射的映射中
- QT通过C++添加映射QML项目
- 在c++中访问int到类对象的映射时出错
- 在C++中搜索嵌套多映射值
- 错误处理.将系统错误代码映射到泛型
- C++匿名结构作为std::映射值
- 如何从存储在std::映射中的std::集中删除元素
- 递归无序映射
- 正在VS调试器中监视映射条目