私は、参照によって突然変異させることができる形質の値を得ようとしています。アーク<RwLock>を&mutに変換する
trait MyTrait {
fn name<'a>(&'a mut self) -> &'a mut String;
}
struct SimpleImpl {
name: String
}
impl MyTrait for SimpleImpl {
fn name<'a>(&'a mut self) -> &'a mut String {
&mut self.name
}
}
use std::sync::{Arc,RwLock};
struct ParallelImpl {
name: Arc<RwLock<String>>
}
impl MyTrait for ParallelImpl {
fn name<'a>(&'a mut self) -> &'a mut String {
self.name.get_mut().unwrap()
}
}
fn main() {
let mut a = SimpleImpl { name: String::from("simple") };
let mut b = ParallelImpl { name: Arc::new(RwLock::new(String::from("parallel"))) };
a.name().as_mut_str();
b.name().as_mut_str();
}
これは
main2.rs:23:9: 23:18 error: cannot borrow immutable borrowed content as mutable
main2.rs:23 self.name.get_mut().unwrap()
なぜできないとコンパイルに失敗します。問題はString
値が非常に大きく、私の解決策は、次のようになりますので、多くのスレッドによってアクセスすることができるということです電話番号get_mut()
に電話してArc
とRwLock
の両方をアンラップしますか?
これは['owning_ref'](https://kimundi.github.io/owning-ref-rs/owning_ref/index.html)の別の仕事のようです。クレート。それは参照とよく似ているがガードを保持している['RwLockWriteGuardRef'](https://kimundi.github.io/owning-ref-rs/owning_ref/type.RwLockWriteGuardRef.html)タイプを含んでいます。 –