我有一个关于Mutex
的快速风格或惯用问题。
是否有一种更优雅的方式来修改fn upper()
中的数据而不是使用*string = match *string
。在双方都取消引用似乎很奇怪,但如果我不这样做,我就不知道如何处理字符串的<MutexGuard>
部分。
链接到playground
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);
}
答案 0 :(得分:5)
当然,有:
*string = string.as_ref()
.map(|x| x.to_uppercase())
.unwrap_or_else(|| "Empty".to_owned())
这实际上并非特定于Mutex
;例如,同样的问题和解决方案适用于&mut Option<String>
。也就是说,*string = match *string { ... }
的解决方案也绝对没问题。顺便说一句,mut
中不需要Some(ref mut x)
,只需Some(ref x)
即可 - to_uppercase()
只需要对字符串的共享引用。