修改 Mutex<Option<>>

6
我有一个关于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);
}
1个回答

6
当然,有的:
*string = string.as_ref()
    .map(|x| x.to_uppercase())
    .unwrap_or_else(|| "Empty".to_owned())

实际上,这不仅仅适用于Mutex;例如,问题和解决方案也适用于 &mut Option<String>。话虽如此,使用*string = match *string { ... }的解决方案也完全可以。顺便说一下,在Some(ref mut x)中不需要mut,只有Some(ref x)就可以了 - to_uppercase()只需要对字符串的共享引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接