我有一个属于结构示例B的结构示例A。我需要通过调用父示例对该数据进行一些处理。
struct A {
val : u8
}
struct B {
data : u8,
a : A
}
impl A {
pub fn process(&mut self, b : &mut B) {
println!("Processing {} - {}", b.data, self.val);
//do stuff with val and data...
}
}
impl B {
pub fn process(&mut self) {
self.a.process(self);
}
}
fn main() {
let mut b = B {
data : 0,
a : A {
val : 3
}
};
b.process();
}
当我尝试调用B()时,我遇到了以下失败:
error[E0499]: cannot borrow `self.a` as mutable more than once at a time
--> src/main.rs:47:9
|
47 | self.a.process(self);
| ^^^^^^^-------^----^
| | | |
| | | first mutable borrow occurs here
| | first borrow later used by call
| second mutable borrow occurs here
error[E0499]: cannot borrow `*self` as mutable more than once at a time
--> src/main.rs:47:24
|
47 | self.a.process(self);
| ---------------^^^^-
| | | |
| | | second mutable borrow occurs here
| | first borrow later used by call
| first mutable borrow occurs here
当不需要可变引用时,所有这些都可以正常工作。
所以我的问题是,当我需要两个结构体之间的这种关系时,正确的方法是什么?
2条答案
按热度按时间rdrgkggo1#
这违反了Rusts的别名规则,您将有两个对
A
的可变引用,一个是直接引用,另一个是通过B
间接引用。(RefCell
,Mutex
,...)但是正如kaya3所指出的,即使从OO的Angular 来看,您建议的实现也显得相当奇怪。我只是直接在B
上实现它,而不使用间接方法。yfwxisqw2#
在Rust中,你可以有一个可变引用或者多个不变引用,或者,换句话说:单个写入器/多个读取器。
遵循此逻辑,我们可以对代码进行一些观察
真正的问题在于
A::process(&mut self, b: &mut B)
不知道self
和b.a
在从B
调用时引用了相同的值,并期望它们是不同的。您可以通过使用克隆或副本来使其工作,但这可能是不必要的。就我个人而言,我可能会尝试将
process()
的逻辑完全移到B上。在您的示例中,A依赖于B,但B也依赖于A。这将使只有B依赖于A,从而使事情变得更简单。