我有一个快速的风格或惯用的问题Mutex.
是否有更优雅的方式来修改数据而fn upper()不是使用*string = match *string.在两边取消引用似乎很奇怪,但如果我不这样做,我不知道如何处理<MutexGuard>字符串的一部分.
链接到游乐场
use std::sync::{Mutex};
#[derive(Debug)]
struct SharedFile{
file: Mutex<Option<String>>
}
impl SharedFile{
fn new()-> SharedFile{
SharedFile{
file: Mutex::new(Some("test".to_owned())),
//file: Mutex::new(None),
}
}
fn upper(&self){
let mut string = self.file.lock().unwrap();
*string= match *string{
Some(ref mut x) => Some(x.to_uppercase()),
None => Some("Empty".to_owned()),
};
println!("{:?}", *string);
}
}
fn main() {
let shared = SharedFile::new();
shared.upper();
println!("{:?}", shared);
}
Run Code Online (Sandbox Code Playgroud)
当然,有:
*string = string.as_ref()
.map(|x| x.to_uppercase())
.unwrap_or_else(|| "Empty".to_owned())
Run Code Online (Sandbox Code Playgroud)
事实上这并不是特定的Mutex; 例如,同样的问题和解决方案适用于&mut Option<String>.也就是说,解决方案*string = match *string { ... }也绝对没问题.顺便说一句,你不需要mut在Some(ref mut x),只要Some(ref x)是好的- to_uppercase()只需要一个共享的参考线.