2012-08-26 12 views
8

I nie wydaje się znaleźć świetny sposób, aby wyrazić w następujący Xtend bez uciekania się do pętli while:Xtend Wsparcia dla pętli i dodawanie Zakres Wsparcie

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

Tak, myślę, że moje pytanie ma dwa części:

  • Czy jest lepszy sposób na wykonanie powyższych czynności? Nie widziałem nic obiecującego w ich znacznej części funkcji, które posiada język, to po prostu rozszerzenia biblioteki Xtend (i są świetne!). Czy istnieje funkcja o Pythonie range(), o której nie wiem?

skończyło się toczenia własną rękę i coś tak:

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

Odpowiedz

15

Dokładny zamiennik

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

jest

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

Wskazówka wyłączny operator zakres: ..<

4

Heh, znalazłem odpowiedź Chwilę później:

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

Można nawet uniknąć pisania 'Integer' ponieważ jest automagicznie wnioskować o Xtend. –

13

Ponadto można robić to bardziej idiomatycznie z

Bardzo nowy w Xtend, ale człowiek to m akes programowania na jvm niesamowite.

+0

Zauważ, że masz pewne ograniczenia wewnątrz wyrażenia lambda [], Na przykład, jeśli chcesz uzyskać dostęp do lokalnej zmiennej localVar wewnątrz tego wyrażenia, wtedy otrzymasz komunikat "Nie można odnieść się do nieostatecznej zmiennej localVar wewnątrz wyrażenia lambda". Odpowiedź rzymka jest bardziej kompletna na pytanie o oryginalny plakat. – CuongHuyTo

+0

zobacz moją odpowiedź poniżej, jeśli potrzebujesz również indeksu iteracji w ramach funkcji –

5

Dla mnie szereg opartych forEach oznacza zakres jest jakiś sens. Na pętli określoną liczbę razy bez zmiennej iteracji, znajdę times pętla Ruby wyraża zamiar jaśniej:

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

Niestety nie jest to częścią IntegerExtensions, ale realizacja jest trywialne:

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

Sugeruje się, aby dodać ją do głównej biblioteki Xtend w https://bugs.eclipse.org/bugs/show_bug.cgi?id=489944 – vorburger

3

Od obsługujemy także "tradycyjne" pętle for, tak jak w Javie.

3

Istnieje faktycznie wersja forEach(), która akceptuje lambdę z dwoma parametrami. Jest to przydatne, jeśli potrzebujesz dostępu do indeksu iteracji w pętli.

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

drukuje:

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