2012-08-26 21 views
8

Me parece que no puede encontrar una gran manera de expresar lo siguiente en Xtend sin tener que recurrir a un bucle while:XTend-lazo del soporte y adición de soporte del rango

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

lo tanto, supongo que mi pregunta tiene dos partes:

  • ¿Hay una manera mejor de hacer lo anterior? No vi nada prometedor en su documenation
  • Una gran parte de las características que tiene el lenguaje son solo las extensiones de la biblioteca Xtend (¡y son geniales!). ¿Hay alguna funcionalidad de range() à la Python que yo no sepa?

acabé rodando solo y tiene algo como lo siguiente:

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 
} 
} 

Respuesta

15

El reemplazo exacto para

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

es

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

Aviso el exclusivo operador de rango: ..<

4

Je, he encontrado la respuesta un poco más tarde:

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

Incluso puede evitar escribir 'Integer' porque es automágicamente inferidas por Xtend. –

13

también puede hacer que sea más idiomáticamente con

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

Muy nuevo en Xtend pero man it m Akes programando en el jvm impresionante.

+0

Tenga en cuenta que tiene alguna restricción dentro de la expresión lambda [], Por ejemplo, si desea acceder a una variable local localVar dentro de esa expresión, entonces recibiría "No se puede hacer referencia a la variable no final localVar dentro de una expresión lambda". Encuentro la respuesta de rzymek más completa a la pregunta del cartel original. – CuongHuyTo

+0

vea mi respuesta a continuación si también necesita el índice de iteración dentro de la función –

5

Para mí, una basada en la gama forEach implica el rango es de alguna manera significativa. Para recorrer un número específico de veces sin variable de iteración, encuentro bucle de Ruby times expresa la intención más clara:

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

Lamentablemente no es una parte de IntegerExtensions, pero la implementación es trivial:

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

Se ha sugerido que se agregue a la biblioteca principal de Xtend en https://bugs.eclipse.org/bugs/show_bug.cgi?id=489944 – vorburger

3

Desde , también admitimos el bucle for "tradicional", al igual que en Java.

3

En realidad, existe una versión de forEach() que acepta una lambda con dos parámetros. Es útil si necesita acceder al índice de iteración dentro del ciclo.

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

impresiones:

element=10 index=0 
element=11 index=1 
element=12 index=2 
Cuestiones relacionadas