gpt4 book ai didi

rust - 根据同一Hashmap中的另一个值插入HashMap中

转载 作者:行者123 更新时间:2023-12-03 11:48:52 25 4
gpt4 key购买 nike

我正在尝试基于同一HashMap中的另一个值将值插入HashMap中,如下所示:

use std::collections::HashMap;

fn main() {
let mut some_map = HashMap::new();
some_map.insert("a", 1);

let some_val = some_map.get("a").unwrap();

if *some_val != 2 {
some_map.insert("b", *some_val);
}
}

给出以下警告:

warning: cannot borrow `some_map` as mutable because it is also borrowed as immutable
--> src/main.rs:10:9
|
7 | let some_val = some_map.get("a").unwrap();
| -------- immutable borrow occurs here
...
10 | some_map.insert("b", *some_val);
| ^^^^^^^^ --------- immutable borrow later used here
| |
| mutable borrow occurs here
|
= note: `#[warn(mutable_borrow_reservation_conflict)]` on by default
= warning: this borrowing pattern was not meant to be accepted, and may become a hard error in the future
= note: for more information, see issue #59159 <https://github.com/rust-lang/rust/issues/59159>

如果我改为尝试更新现有值,则可以使用内部突变和RefCell,如 here所述。

如果尝试基于自身插入或更新值,则可以使用条目API,如 here所述。

我可以解决克隆问题,但我希望避免这种情况,因为实际代码中检索到的值有些复杂。这会要求使用不安全的代码吗?

最佳答案

编辑
由于先前的答案完全是错误的,根本无法回答问题,因此其中的代码没有显示任何警告(playground)

现在,它是一个具有Rc<_>值的哈希图,并且val_rc仅包含实际数据的引用计数器(在这种情况下为1编号)。由于它只是一个计数器,因此无需克隆它。但是请注意,一个数字只有一个副本,因此,如果您修改some_map["a"]的值,那么some_map["b"]也将被修改,因为它们引用的是单个内存。还要注意,1位于堆栈上,因此,如果计划添加许多重物,则最好考虑将其转换为Rc<Box<_>>

use std::collections::HashMap;
use std::rc::Rc;

fn main() {
let mut some_map = HashMap::new();
some_map.insert("a", Rc::new(1));

let val_rc = Rc::clone(some_map.get("a").unwrap());
if *val_rc != 2 {
some_map.insert("b", val_rc);
}

}

以前版本的答案

很难说出您到底在寻找什么,但是在这种特殊情况下,如果只需要检查值,然后在更新哈希图之前销毁借用的值。肮脏和丑陋的代码将是这样的:
fn main() {
let mut some_map = HashMap::new();
some_map.insert("a", 1);

let is_ok = false;

{
let some_val = some_map.get("a").unwrap();
is_ok = *some_val != 2;
}

if is_ok {
some_map.insert("b", *some_val);
}
}

关于rust - 根据同一Hashmap中的另一个值插入HashMap中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61666078/

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