2016-03-11 27 views
6

संशोधित करना मेरे पास Mutex के बारे में एक त्वरित स्टाइलिस्ट या बेवकूफ सवाल है।एक म्यूटेक्स <Option<>>

*string = match *string का उपयोग करने से fn upper() में डेटा को संशोधित करने का एक और शानदार तरीका है। यह दोनों तरफ निराशाजनक लगता है, लेकिन अगर मैं नहीं करता, तो मुझे नहीं पता कि स्ट्रिंग के <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); 
} 

उत्तर

5

ज़रूर, वहाँ है:

*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) में Some(ref x) ठीक नहीं है - to_uppercase() केवल स्ट्रिंग के साझा संदर्भ की आवश्यकता है।

संबंधित मुद्दे