2016-03-11 15 views
6

Mutex hakkında hızlı bir stilistik veya deyimsel sorularım var.Bir Muteksin Değiştirilmesi <Option<>>

fn upper()'daki verileri *string = match *string'u kullanmaktan daha zarif bir yolu var mı? Her iki taraftaki dezavantajı garip görünüyor, fakat eğer yapmazsam, <MutexGuard> dizgisinin nasıl ele alınacağını bilmiyorum.

Bağlantı playground için

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); 
} 

cevap

5

Tabii, orada:

aslında
*string = string.as_ref() 
    .map(|x| x.to_uppercase()) 
    .unwrap_or_else(|| "Empty".to_owned()) 

Bu Mutex özgü değildir; Aynı sorun ve çözüm, örneğin, &mut Option<String> için geçerlidir. Yani, *string = match *string { ... } ile çözüm de kesinlikle iyi. BTW, Some(ref mut x)'da mut'a ihtiyacınız yok, sadece Some(ref x) iyi - to_uppercase() sadece dizeyle paylaşılan bir başvuruya ihtiyaç duyar.

İlgili konular