2014-09-13 8 views
5

पर विचार करें निम्न उदाहरणत्रुटि मिलान

fn main() { 
    f("hello", true); 
} 

fn f(str: &str, sen: bool) { 
    let s: &str = match sen { 
     false => str, 
     true => str.chars().map(|x| x.to_lowercase()).collect().as_slice() 
    }; 
    println!("{}", s); 
} 

मैं यह त्रुटि

error: the type of this value must be known in this conntext                                        
true => str.chars().map(|x| x.to_lowercase()).collect().as_slice() 
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

मैं थोड़ा उलझन में हूँ हो रही है पैटर्न में "इस मान का प्रकार इस संदर्भ में पता होना चाहिए", संकलक को पता नहीं है कि str का प्रकार &str फ़ंक्शन परिभाषा से है? मुझे यहां क्या समझ नहीं आ रहा है?

उत्तर

4

त्रुटि स्थान शायद भ्रमित हो रहा है, समस्या यहां collect विधि है। यह किसी भी FromIterator के लिए सामान्य है और इस मामले में कंपाइलर बिल्ली प्रकार का अनुमान लगाता है (क्या कंपाइलर देखता है कि आपको FromIterator को लागू करने वाले कुछ प्रकार एक्स की आवश्यकता है जिसमें & स्ट्र का उत्पादन करने वाली विधि है)।

इस कोड के साथ दूसरी समस्या यह है कि आप मैच स्टेटमेंट से स्थानीय मान (संग्रह का परिणाम) के संदर्भ को वापस करने का प्रयास कर रहे हैं। आप ऐसा नहीं कर सकते क्योंकि उस मान में उस ब्लॉक का जीवनकाल है और उसके बाद हटा दिया गया है, इसलिए लौटाया जाएगा अमान्य।

fn main() { 
    f("hello", true); 
} 

fn f(str: &str, sen: bool) { 
    let s: String = match sen { 
     false => str.to_string(), 
     true => str.chars().map(|x| x.to_lowercase()).collect() 
    }; 
    println!("{}", s); 
} 

मैं तुम्हें क्या अंत में प्राप्त करने के लिए कोशिश कर रहे हैं पता नहीं है लेकिन MaybeOwned पर एक नज़र डालें अगर यह एक हो जाएगा:

एक काम कर समाधान (लेकिन यह स्ट्रिंग के लिए & str परिवर्तित करने की आवश्यकता है) एक टुकड़ा लौटने वाला फ़ंक्शन (&str) या String

+0

धन्यवाद। मैं 'स्ट्रिंग' को स्टोर करने के लिए अस्थायी चर का उपयोग कर समाप्त हुआ और एस को बाध्य करता हूं 'temp_var.as_slice() '। सुनिश्चित नहीं है कि हालांकि एक बेहतर तरीका है या नहीं। –

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