是否有一个很好的模式可以将使用self不可变地传递给使用self mutable的方法?

时间:2018-09-26 14:47:15

标签: rust borrow-checker

是否有处理这种情况的好模式?

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仅需要从解析器中读取才能打印出源文本中所看到的部分,而不是预期的部分。

理想情况下,每次执行此操作时我都不必创建临时变量。

0 个答案:

没有答案