2015-09-10 11 views
8

से मेल खाने पर पाया गया और स्ट्र। मैं जंग में एक साधारण फ़ंक्शन लिखने की कोशिश कर रहा हूं जो उपयोगकर्ता को "आप" या "मुझे" के उत्तर की अपेक्षा करने वाला प्रश्न पूछेगा। इसे बूलियन वैल्यू वापस करना चाहिए या फिर उपयोगकर्ता से गलत जवाब देने पर पूछना चाहिए।अपेक्षित स्ट्रिंग, एक वैकल्पिक स्ट्रिंग

fn player_starts() -> bool {              
    println!("Who will start (me/you)");          
    loop {                  
     let input = readline::readline(">");          
     match input {               
      Some("me") => return true,           
      Some("you") => return false,           
      _ => None,               
     }                   
    }                   
}  

क्या मैं मिलता है:

error: mismatched types: 
expected `collections::string::String`, 
    found `&'static str` 
(expected struct `collections::string::String`, 
found &-ptr) [E0308] 

वहाँ किसी तरह यहाँ काम करने के लिए मजबूर करने के लिए शाब्दिक है या मेरा लक्ष्य प्राप्त करने के लिए कुछ बेहतर तरीका है मैं के साथ आया था?

उत्तर

9

यह काम करना चाहिए:

fn player_starts() -> bool {      
    println!("Who will start me/you)");      
    loop { 
     let input = readline::readline(">"); 
     match input.as_ref().map(String::as_ref) { 
      Some("me") => return true, 
      Some("you") => return false, 
      _ =>() 
     } 
    } 
} 

नोट मैच बयान में अभिव्यक्ति, जहां हम एक Option<String> से परिवर्तित Option<&str> पर।

4

जिस तरह से आप आमतौर पर &str को String में परिवर्तित करते हैं to_owned है, उदा।

"me".to_owned() 

हालांकि, अगर आप एक String पर पैटर्न मिलान नहीं कर सकते। तुम एक सफलता expect सकता है, उस पर String तो पैटर्न मैच से एक &str मिलती है:

fn player_starts() -> bool {              
    println!("Who will start (me/you)");          
    loop {                  
     let input = readline::readline(">"); 
     match input.expect("Failed to read line").as_ref() { 
      "me" => return true,           
      "you" => return false, 
      _ => println!("Enter me or you"), 
     }                   
    }                   
} 
+1

'to_owned()' या 'in()' (लक्ष्य प्रकार ज्ञात होने पर) 'to_string()' के बजाय यह अधिक मूर्खतापूर्ण है। उत्तरार्द्ध 'प्रदर्शन' विशेषता के माध्यम से काम करता है जो स्वरूपण कोड को आमंत्रित करता है जो कुछ ओवरहेड पेश करता है। हो सकता है कि अगर जंग को विशेष रूप से विशेषज्ञता मिलती है, तो इसे ठीक किया जा सकता है, लेकिन हम अभी तक नहीं हैं। –

+0

@VladimirMatveev धन्यवाद, अभी भी जंग के लिए बहुत नया है, इसलिए मुझे लगता है कि मुझे कम से कम अनुभव के आधार पर ऐसे दावे नहीं करना चाहिए। – TartanLlama

+0

क्या उपर्युक्त के कारण डाउनवोट है या इस समाधान के साथ अन्य समस्याएं हैं? – TartanLlama

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