2015-02-10 19 views
5

repeat का उपयोग करके मैं एक इटरेटर बना सकता हूं जो एक तत्व को दोहराता है। लेकिन मैं असीमित रूप से कई मान कैसे दोहरा सकता हूं? उदाहरण के लिए:मैं एक इटरेटर कैसे बना सकता हूं जो असीमित रूप से कई मानों को दोहराता है?

let repeat_1 = repeat(1); // 1, 1, 1, 1, 1, 1, 1, 1, 1, ... 
let repeat_123 = repeat([1, 2, 3]); // 1, 2, 3, 1, 2, 3, 1, 2, ... // or similar 
+0

कृपया उपयोगी जवाब वोट दें और के रूप में स्वीकार एक जवाब को चिह्नित करता है, तो यह आपकी समस्या को हल करने के लिए सुनिश्चित करें! यदि कोई जवाब स्वीकार्य नहीं है, तो टिप्पणियों को छोड़कर विचार करें कि समस्या को अलग करने के लिए अपने प्रश्न को क्यों संपादित करें या संपादित करें। – Shepmaster

उत्तर

3

इसे बाहर मिला:
एक भी कर सकते हैं repeat सरणियों, tuples या स्लाइस (जरूरतों के आधार पर)।

उदाहरण के लिए

:

let repeat_123 = std::iter::repeat([1, 2, 3]); // [1, 2, 3], [1, 2, 3], ... 

यह इटरेटर नीडिंत है, तथापि, यह समतल, का उपयोग flatmap

let pattern = &[1, 2, 3]; 
let repeat_123_flat = std::iter::repeat(pattern).flat_map(|x| x.iter()); 
+1

मुझे लगता है कि आपको 'let rep = & [1, 2, 3] होना चाहिए; rep_flat = repeat (rep) .flat_map (| x | x.iter()); '(या कम से कम यह काम नहीं करता है क्योंकि आपने इसे प्लेपैन आज भी किस संस्करण पर लिखा है) –

+0

धन्यवाद, मैंने इसे सही किया! – Kapichu

12

आप इस तरह .cycle() उपयोग कर सकते हैं:

fn main() { 
    let values = [1, 2, 3]; 
    let repeat_123 = values.iter().cloned().cycle(); 
    for elt in repeat_123.take(10) { 
     println!("{}", elt) 
    } 
} 

यह काम करता है किसी भी इटेटर पर जिसे क्लोन किया जा सकता है (इटरेटर, इसके तत्व नहीं)।

कृपया ध्यान दें कि .cloned() एडाप्टर आकस्मिक है! यह स्लाइस के इटेटरेटर के मान-संदर्भ इटरेटर तत्वों को मानों में अनुवाद करता है।

एक आसान तरीका इस विशेष अनुक्रम लिखने के लिए:

let repeat_123 = (1..4).cycle(); 
+0

वास्तव में बहुत ही सुरुचिपूर्ण। +1 – Kapichu

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

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