2016-11-04 23 views
5

में इटर पर मानचित्र का उपयोग करते समय" _`` के लिए प्रकार का अनुमान नहीं लगा सकता "मुझे एक समस्या है जहां मैं यादृच्छिक सत्य/झूठे मानों के साथ 2 डी सरणी बूलियन शुरू करने की कोशिश कर रहा हूं लेकिन संकलक प्रतीत नहीं होता है मुझे आवश्यक प्रकारों का अनुमान लगाने में सक्षम होना; मैं बस सोच रहा हूं कि मुझे इसे हल करने में सक्षम होने के लिए अनुमान इंजन के लिए क्या निर्दिष्ट करना है।"जंग

extern crate rand; 

fn main() { 
    let mut grid = [[false; 10]; 10]; 
    grid.iter_mut().map(|row| { [false; 10].iter().map(|_| { rand::random() }).collect() }); 
} 

खेल का मैदान link (rand::random() के बिना)

त्रुटि मैं हो रही है

| grid.iter_mut().map(|row| { [false; 10].iter().map(|_| { rand::random() }).collect() }); 
    |     ^^^ cannot infer type for `_` 
+5

ठीक है, आप ['collect()'] (https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect) पर दस्तावेज़ों को पढ़ना चाहेंगे। एक बार जब आप समझ जाएंगे कि बंद करने का रिटर्न प्रकार क्यों अनुमानित नहीं किया जा सकता है, तो आप अभी भी आकार के सरणी में एकत्र करने में असमर्थ होने के बावजूद हैं। क्या आप बाद में सवाल फिर से कर सकते हैं? –

+1

एक प्रदर्शन के रूप में, आप शायद 'आरएनजी' पकड़ना चाहते हैं और थ्रेड-स्थानीय आरएनजी को पकड़ने के बजाय इसे पुन: उपयोग करना चाहते हैं। – Shepmaster

उत्तर

4

के बाद प्रकार [T; 10] लागू करता Rand जहां T: Rand है, तो आप rand::random() सीधे उपयोग कर सकते हैं:

extern crate rand; 

fn main() { 
    let grid: [[bool; 10]; 10] = rand::random(); 
    println!("{:#?}", grid); 
} 

क्यों प्रकार निष्कर्ष अपने उदाहरण में विफल हो रहा है के लिए के रूप में - यहाँ कुछ थोड़ा सरल है कि समस्या को दिखाता है:

error[E0282]: unable to infer enough type information about `_` 
--> src/main.rs:5:13 
    | 
5 |   let mapped = arr.iter_mut().map(|_| rand::random()).collect(); 
    |    ^^^^^^ cannot infer type for `_` 
    | 
    = note: type annotations or generic parameter binding required 

तो हम प्रकार निर्दिष्ट कर सकते हैं:

fn main() { 
    let mut arr = [false; 10]; 
    let mapped = arr.iter_mut().map(|_| rand::random()).collect(); 
    println!("{:?}", arr); 
    println!("{:?}", mapped); 
} 

त्रुटि देता है:

fn main() { 
    let mut arr = [false; 10]; 
    let mapped = arr.iter_mut().map(|_| rand::random()).collect::<[bool; 10]>(); 
    println!("{:?}", arr); 
    println!("{:?}", mapped); 
} 

"टर्बो के उपयोग पर ध्यान दें मछली " ऑपरेटर ::<> इकट्ठा करने के प्रकार को निर्दिष्ट करने के लिए एकत्र करने के बाद, इस मामले में ::<[bool; 10]>। दुर्भाग्य से यहाँ संकलक शिकायत:

error[E0277]: the trait bound `[_; 10]: std::iter::FromIterator<bool>` is not satisfied 

तो std::iter::FromIterator<bool> क्या है?

fn collect<B>(self) -> B 
    where B: FromIterator<Self::Item> 

इसका मतलब यह है जो भी प्रकार आप की जरूरत में जमा कर रहे हैं FromIterator<Self::Item> लागू करने के लिए: ठीक है, collect समारोह की परिभाषा पर विचार करें। दुर्भाग्यवश, FromIterator लागू करें, लेकिन Vec, VecDeque, HashSet, BTreeSet और इसी तरह के कई संभावित प्रकार हैं।

[false, false, false, false, false, false, false, false, false, false] 
[true, false, false, true, true, false, true, false, true, true] 

तो क्या देता है:

fn main() { 
    let mut arr = [false; 10]; 
    let mapped = arr.iter_mut().map(|_| rand::random()).collect::<Vec<bool>>(); 
    println!("{:?}", arr); 
    println!("{:?}", mapped); 
} 

बहरहाल, यह आप परिणाम आप के लिए उम्मीद कर रहे थे नहीं दे सकता है: तो हम उदाहरण संशोधित कर सकते हैं? arr उत्परिवर्तित क्यों नहीं किया गया था, भले ही इसे म्यूटेबल घोषित किया गया हो, और हमने iter_mut का उपयोग किया? इसका कारण यह है कि map मौजूदा 0 से नया ऑब्जेक्ट उत्पन्न करता है - यह "इन-प्लेस" मानचित्र नहीं करता है।क्या तुम सच में यथा-स्थान मैप करने के लिए चाहते हैं तो आपके निम्नलिखित इस्तेमाल कर सकते हैं:

[true, false, true, true, true, false, false, false, true, true] 
[(),(),(),(),(),(),(),(),(),()] 

हालांकि पैदावार

fn main() { 
    let mut arr = [false; 10]; 
    let mapped = arr.iter_mut().map(|b| *b = rand::random()).collect::<Vec<()>>(); 
    println!("{:?}", arr); 
    println!("{:?}", mapped); 
} 

, iterators के इस प्रयोग unidiomatic माना जाता है (भ्रामक उल्लेख करने के लिए नहीं) -

fn main() { 
    let mut arr = [false; 10]; 
    for b in &mut arr { 
     *b = rand::random(); 
    } 
    println!("{:?}", arr); 
} 
[false, true, true, true, false, false, true, false, true, false] 
: मुहावरेदार तरह से एक for पाश उपयोग करने के लिए किया जाएगा

बहुत बेहतर। बेशक इस विशेष मामले में, मेरा पहला उदाहरण शायद जाने का तरीका है।