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 中的所有键和值?

hashmap的遍历

java LinkedHashMap,TreeMap,HashMap

如何根据值以升序打印 HashMap<String, String> 的内容?

HashMap集合存储学生对象并遍历