【发布时间】:2018-01-12 07:43:24
【问题描述】:
我一直在我的 Rust 程序中偶然发现一个模式,这总是让我与借用检查器发生冲突。考虑以下玩具示例:
use std::sync::{Arc,RwLock};
pub struct Test {
thing: i32,
}
pub struct Test2 {
pub test: Arc<RwLock<Test>>,
pub those: i32,
}
impl Test {
pub fn foo(&self) -> Option<i32> {
Some(3)
}
}
impl Test2 {
pub fn bar(&mut self) {
let mut test_writer = self.test.write().unwrap();
match test_writer.foo() {
Some(thing) => {
self.add(thing);
},
None => {}
}
}
pub fn add(&mut self, addme: i32) {
self.those += addme;
}
}
这不会编译,因为 Some 分支中的 add 函数试图可变地借用 self,它已经在 match 语句上方不可变地借用以打开读写锁。
我在 Rust 中遇到过几次这种模式,主要是在使用 RwLock 时。我还找到了一种解决方法,即在 match 语句之前引入一个布尔值,然后更改 Some 臂中布尔值的值,然后最后在 match 语句之后对该布尔值引入一个测试以执行任何操作是我想在Some 手臂上做的。
在我看来这不是解决问题的方法,我认为在 Rust 中有一种更惯用的方法来做到这一点 - 或者以完全不同的方式解决问题 - 但我找不到它。如果我没记错的话,这个问题与词法借用有关,所以self 不能在匹配语句的范围内可变地借用。
有没有一种惯用的 Rust 方法来解决这类问题?
【问题讨论】:
标签: rust matching borrow-checker