gpt4 book ai didi

rust - 从方法调用中使用rust 多个可变的 self 借用

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

我正在学习Rust。对于我的第一个程序,我编写了以下代码来维护有关部分排序的数据:

use std::collections::{HashMap, HashSet};

struct Node {
num_before: usize,
successors: HashSet<String>,
}

impl Node {
fn new() -> Node {
Node {
num_before: 0,
successors: HashSet::new(),
}
}
}

pub struct PartialOrdering {
node: HashMap<String, Node>,
}

impl PartialOrdering {
pub fn new() -> PartialOrdering {
PartialOrdering {
node: HashMap::new(),
}
}

pub fn get_node(&mut self, name: &String) -> &mut Node {
self.node.entry(name.clone()).or_insert_with(Node::new)
}

pub fn add_order(&mut self, before: &String, after: &String) {
let mut before_node = self.get_node(before);
if after != before {
let mut after_node = self.get_node(after);
if before_node.successors.insert(after.clone()) {
after_node.num_before += 1;
}
}
}
}
编译此代码会产生以下错误:
error[E0499]: cannot borrow `*self` as mutable more than once at a time
--> main.rs:35:25
|
33 | let before_node = self.get_node(before);
| ---- first mutable borrow occurs here
34 | if after != before {
35 | let mut after_node = self.get_node(after);
| ^^^^ second mutable borrow occurs here
36 | if before_node.successors.insert(after.clone()) {
| ---------------------- first borrow later used here
诚然,我是Rust借用规则的新手,但是这个问题使我感到困惑。请告诉我我做错了什么,如何解决?

最佳答案

问题在于,在Rust中,禁止一次对一个对象进行多个可变的引用(&mut)(有关详细信息,请参见here)。您的get_node()接受&mut self并使用它来获取&mut Node(其中selfself)中包含的PartialOrdering。只要self返回的值存在,这就会导致get_node()的可变借位存在,从而阻止了对get_node()的其他调用。不幸的是,这意味着您不能在同一范围内使用before_node: &mut Nodeafter_node: &mut Node

关于rust - 从方法调用中使用rust 多个可变的 self 借用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63043390/

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