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