2015-04-03 8 views
5

Sono perplesso dalla seguente osservazione. Da un lato, questo funziona:Nim: Come eseguire un'iterazione su una sezione?

for i in 5..10: 
    echo i 

Ma appena posso conservare la fetta in una variabile, che non possono più scorrere su di esso, vale a dire, questa fallisce:

var slice = 5..10 
for i in slice: 
    echo i 

L'errore è type mismatch: got (Slice[system.int]) e, apparentemente, non è presente la firma sovraccarica dell'iteratore system.items per Slice[T]. Questo solleva le domande:

  • Perché funziona nel primo caso?
  • Esiste una soluzione alternativa per iterare su una sezione nel secondo caso?

risposta

6

Con for i in 5..10: si richiama l'iteratore .. (doc), che è solo un alias per il conteggio. Poiché si tratta di un iteratore in linea, trasforma il ciclo for in un ciclo while sui valori da 5 a 10. Ma gli iteratori in linea non possono essere assegnati a una variabile, ad eccezione degli iteratori di chiusura.

Con var slice = 5..10 si richiama il proc .. (doc), che genera un Slice(a: 5, b: 10). Ma per Slices non è stato definito un iteratore predefinito items.

Si potrebbe eseguire iterazioni da slice.a a slice.b, in questo modo:

var slice = 5..10 
for i in slice.a .. slice.b: 
    echo i 

Poiché questo non è molto bello, la soluzione corretta è quella di definire il proprio items iteratore, in questo modo:

iterator items*[T](s: Slice[T]): T = 
    for i in s.a .. s.b: 
    yield i 

var slice = 5..10 
for i in slice: 
    echo i 

Poiché questo mi sembra abbastanza ragionevole, ho fatto una richiesta di pull per includere questo nel modulo di sistema: https://github.com/nim-lang/Nim/pull/2449

+0

Pe grazie, grazie! – bluenote10