gpt4 book ai didi

rust - 不能借用 `*self` 作为可变的,因为 `self.history[..]` 也被借用为不可变的

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

代码如下所示,在一个函数中,该函数是 Context 结构的实现,定义如下:

struct Context {
lines: isize,
buffer: Vec<String>,
history: Vec<Box<Instruction>>,
}

当然还有函数,作为实现:

fn _execute_history(&mut self, instruction: &Instruction) -> Reaction {
let num = instruction.suffix.parse::<usize>();
match num {
Ok(number) => {
match self.history.get(number) {
Some(ins) => { return self.execute(*ins); },
_ => { /* Error handling */ }
}
}
Err(..) => { /* Error handling */ }
}
}

这不会编译,我不明白错误消息。我在网上搜索了类似的问题,但我似乎无法理解这里的问题。我来自 Python 背景。完整错误:

hello.rs:72:23: 72:35 note: previous borrow of `self.history[..]` occurs here; the immutable
borrow prevents subsequent moves or mutable borrows of `self.history[..]` until the borrow ends

我完全知道该函数不符合类型系统,但这是因为简化代码仅用于演示目的。

最佳答案

您使用 getself.history 中借用了一个值,并且当您在 上调用 execute 时,该借用仍然“有效” self (这需要 &mut self 我可以从错误中看到)

在这种情况下,从匹配中返回您的值并在匹配后调用 self.execute:

fn _execute_history(&mut self, instruction: &Instruction) -> Reaction {
let num = instruction.suffix.parse::<usize>();
let ins = match num {
Ok(number) => {
match self.history.get(number) {
Some(ins) => ins.clone(),
_ => { /* Error handling */ panic!() }
}
}
Err(..) => { /* Error handling */ panic!() }
};
self.execute(ins)
}

关于rust - 不能借用 `*self` 作为可变的,因为 `self.history[..]` 也被借用为不可变的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23032464/

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