2015-02-10 14 views
5

Utilizzo di repeat È possibile creare un iteratore che ripete un elemento. Ma come posso ripetere più valori infinitamente? Ad esempio:Come posso creare un iteratore che ripete infiniti valori multipli?

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

Assicurati di upvote risposte utili e contrassegnare una risposta accettata se risolto il problema! Se nessuna risposta è accettabile, considera di lasciare commenti che spieghino il motivo o modifica la tua domanda per esprimere il problema in modo diverso. – Shepmaster

risposta

3

giudicata out:
Si può anche repeat array tuple o fette (a seconda delle esigenze).

Ad esempio:

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

Questo iteratore è annidato, tuttavia, per appiattirla, utilizzare flatmap

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

Penso che potrebbe essere necessario avere 'let rep = & [1, 2, 3]; let rep_flat = repeat (rep) .flat_map (| x | x.iter()); '(o almeno non funziona come lo hai scritto su qualunque versione il box usi oggi) –

+0

Grazie, l'ho corretto! – Kapichu

12

È possibile utilizzare .cycle() come questo:

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

E funziona su qualsiasi iteratore che può essere clonato (l'iteratore , non i suoi elementi).

Si prega di notare che l'adattatore .cloned() è incidentale! Traduce gli elementi iteratori di riferimento dell'iteratore della sezione in valori.

Un modo più semplice di scrivere questa particolare sequenza è:

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

Davvero molto elegante. +1 – Kapichu

Problemi correlati