私はいつも私を借りチェッカーと競合させる私の錆のプログラムのパターンにつまずいています。次のおもちゃの例を考えてみましょう:錆の照合と借用チェッカー
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
機能がすでに読み書きを開くためにちょうど一致ステートメントの上immutably借りた、mutably自己を借りしようとするので、これはコンパイルされません。ロック。
主にRwLock
を使用しているときに、このパターンがRustで数回発生しました。また、match
ステートメントの前にブール値を導入し、次にSome
アームのブール値を変更して、最終的には、このブール値のテストをマッチステートメントの後に導入して、何でもしたいSome
アームで実行します。
それはそれを行う方法ではないと思うが、私はRustでこれを行うより慣用的な方法があると思うか、まったく異なる方法で問題を解決する。私が間違っていないならば、問題は字句借用と関係しているので、self
は、マッチステートメントの武器内で可変的に借りることはできません。
この種の問題を解決する慣習的な錆の方法がありますか?
慣用的な解決策。 –