【发布时间】:2022-01-07 02:25:09
【问题描述】:
run 和 send 方法都需要 self 对象,send 函数还需要可变的 Packet 引用:
struct Package {
id: u32,
}
impl Package {
fn new(id: u32) -> Package {
Package { id }
}
}
struct Manager {
packages: Vec<Package>,
}
impl Manager {
fn new() -> Manager {
Manager {
packages: vec![
Package::new(1),
Package::new(2),
Package::new(3),
Package::new(4),
],
}
}
fn run(&mut self) {
for package in self.packages.iter_mut() {
if package.id == 1 {
self.send(package);
}
println!("{}", package.id);
}
}
fn send(&self, package: &mut Package) {
package.id = 23;
}
}
fn main() {
let manager = Manager::new();
manager.run();
}
error[E0502]: cannot borrow `*self` as immutable because it is also borrowed as mutable
--> src/main.rs:29:17
|
27 | for package in self.packages.iter_mut() {
| ------------------------
| |
| mutable borrow occurs here
| mutable borrow later used here
28 | if package.id == 1 {
29 | self.send(package);
| ^^^^ immutable borrow occurs here
error[E0596]: cannot borrow `manager` as mutable, as it is not declared as mutable
--> src/main.rs:41:5
|
40 | let manager = Manager::new();
| ------- help: consider changing this to be mutable: `mut manager`
41 | manager.run();
| ^^^^^^^ cannot borrow as mutable
如何重构这两个函数以使其正常工作?
我不想复制数据包,因为这会给我的原始代码带来很多麻烦。
【问题讨论】:
标签: rust reference self borrow-checker