gpt4 book ai didi

rust - 如何根据来自 self 的散列图的值(value)引用来更新 self

转载 作者:行者123 更新时间:2023-11-29 08:05:10 25 4
gpt4 key购买 nike

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

struct A {
map: HashMap<String, String>,
i: i32
}
impl A {
fn test(&mut self) {
match self.map.get("abc") {
None => {},
Some(x) => self.trigger(&x)
}
}

fn trigger(&mut self, x: &str) {
self.i += 1;
}
}

代码不起作用,因为 self.trigger 可变地借用了 self,而 self.map.get 保持了不可变的借用self 范围内。

如果我可以确保在 trigger 中不修改 self.map,有什么方法可以让它工作吗?

我不能使 trigger 不可变地借用 self,如 Can I borrow self immutably for self.callbacks: Vec<Box<FnMut>>?

我正在使用 rustc 1.19.0-nightly。

最佳答案

这里的问题是借用检查器不知道trigger 只会改变self.i。据借用检查器所知,它还可能更改 self.map,这是不安全的。

解决方案是告诉借用检查器更多有关 trigger 更改的信息。

一种方法是将 trigger 需要可变借用的所有内容移动到它自己的结构中,然后为该结构实现触发器:

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

struct TriggerThing {
i: i32
}

impl TriggerThing {
fn trigger(&mut self, _: &HashMap<String, String>, x: &str) {
self.i += 1;
}
}

struct A {
map: HashMap<String, String>,
trigger_thing: TriggerThing,
}

impl A {
fn test(&mut self) {
// Its fine to have a immutable borrow of self.map
// and a mutable borrow of self.trigger_thing at the
// same time, since borrowing self.trigger_thing does not
// imply a mutable borrow of self.map.
if let Some(x) = self.map.get("abc") {
// Notice that we can still give self.trigger_thing
// access to self.map, as long as we only
// give it an immutable reference
self.trigger_thing.trigger(&self.map, &x)
}
}
}

参见 Rust Book: If Let如果您之前没有看过很棒的 if let 语法。

关于rust - 如何根据来自 self 的散列图的值(value)引用来更新 self ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44142080/

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