hashmap - 如何遍历Hashmap,打印键/值并删除Rust中的值?
Posted 跨链技术践行者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hashmap - 如何遍历Hashmap,打印键/值并删除Rust中的值?相关的知识,希望对你有一定的参考价值。
在任何语言中,这都应该是一项微不足道的任务。这在铁锈中不起作用。
use std::collections::HashMap;
fn do_it(map: &mut HashMap<String, String>) {
for (key, value) in map {
println!("{} / {}", key, value);
map.remove(key);
}
}
fn main() {}
以下是编译器错误:
<span style="color:#212529"><span style="background-color:#ffffff"><code style="margin-left:2px">error[E0382]: use of moved value: `*map`
--> src/main.rs:6:9
|
4 | for (key, value) in map {
| --- value moved here
5 | println!("{} / {}", key, value);
6 | map.remove(key);
| ^^^ value used here after move
|
= note: move occurs because `map` has type `&mut std::collections::HashMap<std::string::String, std::string::String>`, which does not implement the `Copy` trait
</code></span></span>
为什么要移动引用?从文档来看,我不认为移动/借用适用于引用。
最佳答案
不允许这样做至少有两个原因:
您需要有两个对map
的并发可变引用,一个由for
循环中使用的迭代器持有,另一个在变量map
中调用map.remove
。
在尝试对映射进行变异时,对映射中的键和值具有引用。如果允许您以任何方式修改映射,则这些引用可能会失效,从而打开内存不安全的大门。
核心生锈原理是混淆异或可变性。您可以对一个值有多个不可变的引用,也可以对它有单个不可变的引用。
我不认为搬家/借书适用于推荐人。
每种类型都受制于Rust的移动规则和可变别名。请让我们知道文件中的哪些部分说它不是,这样我们就可以解决这个问题。
为什么要移动引用?
它由两部分组成:
只能有一个可变引用for
循环take the value to iterate over by value
当您调用for (k, v) in map {}
时,map
的所有权将转移到for循环,现在已不复存在。
我将对映射执行不可变的借用(&*map
)并对其进行迭代。最后,我会把事情弄清楚:
fn do_it(map: &mut HashMap<String, String>) {
for (key, value) in &*map {
println!("{} / {}", key, value);
}
map.clear();
}
用以字母“a”开头的键删除每个值
我会用HashMap::retain
:
fn do_it(map: &mut HashMap<String, String>) {
map.retain(|key, value| {
println!("{} / {}", key, value);
!key.starts_with("a")
})
}
这就保证了当地图实际上被修改时,已经不存在了,所以任何借来的都已经过去了。
关于hashmap - 如何遍历Hashmap,打印键/值并删除Rust中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58380395/
以上是关于hashmap - 如何遍历Hashmap,打印键/值并删除Rust中的值?的主要内容,如果未能解决你的问题,请参考以下文章
在Java中遍历HashMap时如何确保键的顺序不能改变? [复制]
如何在 Android 中打印 HashMap 中的所有键和值?
java LinkedHashMap,TreeMap,HashMap