修改互斥锁<选项<>>

Xav*_* T. 6 rust

我有一个快速的风格或惯用的问题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)

Vla*_*eev 5

当然,有:

*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 { ... }也绝对没问题.顺便说一句,你不需要mutSome(ref mut x),只要Some(ref x)是好的- to_uppercase()只需要一个共享的参考线.