是否有处理这种情况的好模式?
struct Thing {
x: i32,
}
impl Thing {
fn write_and_get_val(&mut self) -> i32 {
self.x = 5;
self.x
}
fn read_only(&self, val: i32) {
println!("x is {}, val is {}", self.x, val);
}
}
fn main() {
let mut t = Thing { x: 0 };
t.read_only(t.write_and_get_val());
}
error[E0502]: cannot borrow `t` as mutable because it is also borrowed as immutable
--> src/main.rs:20:17
|
20 | t.read_only(t.write_and_get_val());
| - ^ - immutable borrow ends here
| | |
| | mutable borrow occurs here
| immutable borrow occurs here
如果我根据write_and_get_val
的结果制作一个临时变量,那很好,这显然是一个相对容易的解决方法,只是有些乏味。我猜是因为read_only
是在嵌套调用之前不可变地借用的,所以它不起作用。
以上是人为的示例。我的实际用例是解析器,我在其中编写类似以下内容的文件:
self.expecting(self.parse_string("Carrots McDougal"), "a good pony name")?;
parse_string
通过将解析器在源字符串中向前移动来对其进行突变,expecting
仅需要从解析器中读取才能打印出源文本中所看到的部分,而不是预期的部分。
理想情况下,每次执行此操作时我都不必创建临时变量。