2012-08-26 12 views
8

io non riesco a trovare un ottimo modo per esprimere quanto segue in Xtend senza ricorrere a un ciclo while:XTend For-loop Supporto e aggiunta di supporto Gamma

for(int i = 0; i < 3; i++){ 
    println("row "); 
} 
println("your boat"); 

Quindi, credo che la mia domanda ha due parti:

  • C'è un modo migliore per fare quanto sopra? Non ho visto nulla di promettente nel loro documenation
  • Una gran parte delle funzionalità del linguaggio sono solo estensioni della libreria Xtend (e sono grandiose!). Esiste la funzionalità range() alla Python che non conosco?

ho finito rotazione mia e ottenuto qualcosa di simile al seguente:

class LanguageUtil { 

def static Iterable<Integer> range(int stop) { 
    range(0, stop) 
} 

def static Iterable<Integer> range(int start, int stop) { 
    new RangeIterable(start, stop, 1) 
} 

def static Iterable<Integer> range(int start, int stop, int step) { 
    new RangeIterable(start, stop, step) 
} 
} 

// implements Iterator and Iterable which is bad form. 
class RangeIterable implements Iterator<Integer>, Iterable<Integer> { 
val int start 
val int stop 
val int step 
var int current 

new(int start, int stop, int step) { 
    this.start = start; 
    this.stop = stop; 
    this.step = step 
    this.current = start 
} 

override hasNext() { 
    current < stop 
} 

override next() { 
    val ret = current 
    current = current + step 
    ret 
} 

override remove() { 
    throw new UnsupportedOperationException("Auto-generated function stub") 
} 

/** 
* This is bad form. We could return a 
* new RangeIterable here, but that seems worse. 
*/ 
override iterator() { 
    this 
} 
} 

risposta

15

La sostituzione esatto per

for(int i = 0; i < 3; i++){ 
    println("row "); 
} 

è

for (i : 0 ..< 3) { 
    println("row ") 
} 

Avviso esclusivo operatore di intervallo: ..<

4

Eh, ho trovato la risposta un po 'più tardi:

for(i: 1..3) { 
    println("row ") 
} 
+0

Si può anche evitare di scrivere 'Integer' perché è automagicamente dedotte da Xtend. –

13

Inoltre è possibile farlo più idioma con

(1..3).forEach[println("row")] 

Molto nuovo a Xtend ma man it m Mi piace programmare sul jvm fantastico.

+0

Si noti che si ha qualche restrizione all'interno dell'espressione lambda [], ad esempio se si desidera accedere a una variabile locale localVar all'interno di tale espressione, si riceverà "Impossibile riferirsi alla variabile non finale localVar all'interno di un'espressione lambda". Trovo la risposta di rzymek più completa alla domanda del poster originale. – CuongHuyTo

+0

vedere la mia risposta qui sotto se è necessario anche l'indice di iterazione all'interno della funzione –

5

Per me una gamma basata forEach implica la gamma è in qualche modo significativo. Per looping un numero specifico di volte con nessuna variabile di iterazione, trovo times ciclo di Ruby esprime l'intento più chiaramente:

3.times [|println("row")] 

Purtroppo non è una parte del IntegerExtensions, ma l'implementazione è banale:

def static times(int iterations, Runnable runnable) { 
    if (iterations < 0) throw new IllegalArgumentException(
      '''Can't iterate negative («iterations») times.''') 
    for (i: 0 ..< iterations) runnable.run() 
} 
+0

Questo è stato suggerito per essere aggiunto alla libreria Xtend principale in https://bugs.eclipse.org/bugs/show_bug.cgi?id=489944 – vorburger

3

Dal , supportiamo anche il "tradizionale" for-loop, proprio come in Java.

3

Esiste in realtà una versione di forEach() che accetta un lambda con due parametri. È utile se è necessario accedere all'indice di iterazione all'interno del ciclo.

(10..12).forEach[ x, i | println('''element=«x» index=«i»''')] 

stampe:

element=10 index=0 
element=11 index=1 
element=12 index=2 
Problemi correlati