gpt4 book ai didi

hashmap - 如何遍历Hashmap,打印键/值并删除Rust中的值?

转载 作者:行者123 更新时间:2023-11-29 08:30:49 61 4
gpt4 key购买 nike

在任何语言中,这都应该是一项微不足道的任务。这在铁锈中不起作用。

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() {}

以下是编译器错误:
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

为什么要移动引用?从文档来看,我不认为移动/借用适用于引用。

最佳答案

不允许这样做至少有两个原因:
您需要有两个对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/

61 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com