我正在处理一个可以简化为以下代码的问题.结果是error[E0499]: cannot borrow
*Dog as mutable more than once at a time.
.
我很清楚这个错误的根源,但我想知道解决它的正确方法是什么?
请注意,Walker
和Swimmer
特征使用一个公共字段来减少剩余的energy
个特征,所以对我来说,让Dog
同时实现这两个特征是有意义的.
我想保持功能move_around
不变,因为行走和游泳的顺序对我很重要:)任何帮助都将不胜感激.
trait Swimmer {
fn swim(&mut self);
}
trait Walker {
fn walk(&mut self);
}
struct Fish {}
impl Swimmer for Fish {
fn swim(&mut self) {}
}
struct Turtle {}
impl Walker for Turtle {
fn walk(&mut self) {}
}
struct Dog {
energy: usize,
}
impl Swimmer for Dog {
fn swim(&mut self) {
self.energy -= 1;
}
}
impl Walker for Dog {
fn walk(&mut self) {
self.energy -= 1;
}
}
fn move_around(walker: &mut dyn Walker, swimmer: &mut dyn Swimmer) {
walker.walk();
swimmer.swim();
}
fn main() {
// This does not compile: error[E0499]: cannot borrow `*dog` as mutable more than once at a time
let dog = &mut Dog { energy: 100 };
move_around(dog, dog);
// Works fine.
// move_around(&mut Turtle {}, &mut Fish {});
}
我找到的一种可能的解决方案是拆分borrow -这意味着向Dog
struct 添加Walker
和Swimmer
个字段并将它们传递给函数,但共享状态使其变得复杂.
Edit个
我猜在本例中,我可以使用我想要避免的RefCell
,或者添加一个接受带有特征界限的泛型的新函数:
fn move_around<T: Walker + Swimmer>(entity: &mut T) {
entity.walk();
entity.swim();
}