2016-04-03 7 views
12

इस तरह के इस उदाहरण में let उपयोग करने के लिए भूल के रूप में कई बार मैं गलत वाक्य रचना का उपयोग किया है,:टाइप टाइपिंग क्या है?

let closure_annotated = |value: i32| -> i32 { 
    temp: i32 = fun(5i32); //<-- Error 
    temp + value + 1 
}; 
error: type ascription is experimental (see issue #23416) 
      temp: i32 = fun(5i32); //<-- Error 
      ^~~~~~~~~ 

मुझे पता है कि इस समस्या को let का उपयोग कर हल किया जाता है, लेकिन किसी को क्या "प्रकार जोड़ना व्याख्या कर सकते हैं "क्या है और इसका क्या उपयोग है?

मुझे issue #23416 और the feature gate for type ascription मिला, लेकिन मुझे यह समझने के लिए कुछ भी नहीं मिला कि "टाइप टाइप" क्या है और इसका उद्देश्य क्या है।

उत्तर

22

टाइप लिप्यंतरण उस प्रकार के साथ अभिव्यक्ति को एनोटेट करने की क्षमता है जिसे हम चाहते हैं। जंग में लिखित टाइप RFC 803 में वर्णित है।

कुछ स्थितियों में, अभिव्यक्ति का प्रकार संदिग्ध हो सकता है। उदाहरण के लिए, इस कोड:

<anon>:2:38: 2:47 error: unable to infer enough type information about `_`; type annotations or generic parameter binding required [E0282] 
<anon>:2  println!("{:?}", "hello".chars().collect()); 
               ^~~~~~~~~ 

क्योंकि collect विधि किसी भी प्रकार कि इटरेटर के Item प्रकार के लिए FromIterator विशेषता लागू करता लौट सकते है यही कारण है कि:

fn main() { 
    println!("{:?}", "hello".chars().collect()); 
} 

निम्न त्रुटि देता है। प्रकार जोड़ना साथ, एक लिख सकते हैं:

fn main() { 
    println!("{:?}", "hello".chars().collect(): Vec<char>); 
} 
वर्तमान के बजाय

इस अभिव्यक्ति disambiguating के तरीके (जंग 1.7 के रूप में):

fn main() { 
    println!("{:?}", "hello".chars().collect::<Vec<char>>()); 
} 

या:

fn main() { 
    let vec: Vec<char> = "hello".chars().collect(); 
    println!("{:?}", vec); 
} 
+0

आपको बहुत बहुत धन्यवाद स्पष्टीकरण और लिंक –

+1

के लिए एक भी * बेहतर * उदाहरण 'इनो' है; क्योंकि प्रकार पैरामीटर * विशेषता * का एक पैरामीटर है, यह टाइप करने के लिए '.into()' विधि कॉल को एनोटेट करने के लिए * असंभव * है। इसके बजाय आपको एनोटेटेड फ़ंक्शन कॉल का उपयोग करने के लिए अभिव्यक्ति को फिर से लिखना होगा। –

+0

'ऐसा इसलिए है क्योंकि संग्रह विधि किसी भी प्रकार को वापस कर सकती है जो FromIterator' लागू करती है - लेकिन यह "वर्ण()" के प्रकार के अलावा कुछ भी क्यों वापस कर देगी? –

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