gpt4 book ai didi

rust - 如何在插入 `HashMap` 后立即获得对键和值的引用?

转载 作者:行者123 更新时间:2023-11-29 08:14:21 24 4
gpt4 key购买 nike

use std::collections::HashMap;
use std::collections::hash_map::Entry::*;

fn hook(k: &str, v: &str) {}

fn tt(k: String, v: String) -> Option<String> {
let mut a: HashMap<String, String> = HashMap::new();
match a.entry(k) {
Occupied(mut occupied) => {
let old = occupied.insert(v);
//hook(&k, &old);
Some(old)
}
Vacant(vacant) => {
let v = vacant.insert(v);
let k = vacant.key(); // Why doesn't it work?
//hook(&k, v);
None
}
}
}

我想在将键插入到 HashMap 后立即调用 hook。看来我必须使用Entry。但是,我无法在 vacant.insert 之后立即调用 vacant.key()

最佳答案

TL;DR:你不能(现在?)


编译器告诉您为什么它不起作用。不要犹豫,阅读 Rust 编译器消息;它们并不可怕,而且已经付出了很多努力!

error[E0382]: use of moved value: `vacant`
--> src/main.rs:16:21
|
15 | let v = vacant.insert(v);
| ------ value moved here
16 | let k = vacant.key();
| ^^^^^^ value used here after move
|
= note: move occurs because `vacant` has type `std::collections::hash_map::VacantEntry<'_, std::string::String, std::string::String>`, which does not implement the `Copy` trait

这只是普通的 Rust 代码。 VacantEntry::insert按值消耗 self,返回对插入值的引用:

fn insert(self, value: V) -> &'a mut V

over 100 other question/answer pairs询问此错误消息,因此我假设您已经阅读了足够多的内容以理解问题;毕竟,这就是我们在 Stack Overflow 上回答问题的原因!


那么为什么会这样?这更难回答。当您插入 HashMap 时,它会获得键和值的所有权。当您使用 entry API 时,有一个中间步骤 - 您已将 key 的所有权授予该条目。条目 具有对HashMap 的可变引用;值所在位置的“书签”。

当缺少值然后插入一个值时,键将从条目中转移到 HashMap 中。这意味着对条目内 key 的引用将无效。这就是为什么您不能对这两行重新排序的原因。

但是,更深入地考虑一下,insert 返回的 value 指的是在插入值之后的底层 HashMap .我看不出有任何理由阻止添加返回对键和值的引用的函数。但是现在没有这样的功能。

另见 How can I keep a reference to a key after it has been inserted into a HashMap?


我很确定在这种情况下您不需要该功能。

如果您想为 值调用它,只需在插入之前执行所有这些操作:

hook(&k, &v);
a.insert(k, v);

如果你只想为旧值做这件事,而在以前没有值时什么也不做,你可以:

Occupied(mut occupied) => {
let old = occupied.insert(v);
hook(occupied.key(), &old);
Some(old)
}

如果你想用 old 值调用钩子(Hook),如果有的话,用 new 值调用(这看起来不一致),你可以调用它 添加之前,hook 函数不会更明智,因为参数只是引用:

Vacant(vacant) => {
hook(vacant.key(), &v);
let v = vacant.insert(v);
None
}

关于rust - 如何在插入 `HashMap` 后立即获得对键和值的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43681409/

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