9

whileループを使用せずに、Xtendで次のことを表現するための優れた方法を見つけることができないようです。

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

ですから、私の質問には2つの部分があると思います。

  • 上記を行うためのより良い方法はありますか?私は彼らの文書に有望なものを見ませんでした
  • この言語が持つ機能の大部分は、Xtendライブラリの拡張機能です(そしてそれらは素晴らしいです!)。range()私が知らないPythonの機能はありますか?

私は自分自身を転がしてしまい、次のようなものを手に入れました:

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

6 に答える 6

17

の正確な代替品

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

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

排他的範囲演算子に注意してください。..<

于 2013-05-16T07:13:55.280 に答える
14

また、より慣用的にそれを行うことができます

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

Xtendは非常に新しいですが、jvmでのプログラミングを素晴らしいものにします。

于 2013-02-02T05:45:51.420 に答える
5

私にとって、範囲ベースforEachは、範囲が何らかの意味を持っていることを意味します。反復変数なしで特定の回数ループする場合、Rubyのtimesループは意図をより明確に表現していることがわかります。

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

残念ながら、それはの一部ではありませんIntegerExtensionsが、実装は簡単です。

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()
}
于 2013-08-05T18:45:46.693 に答える
4

ええ、私はしばらくして答えを見つけました:

for(i: 1..3) {
    println("row ")
}
于 2012-08-26T02:13:53.473 に答える
3

Xtend 2.6以降、Javaと同様に、「従来の」forループもサポートしています。

于 2014-06-16T06:44:56.863 に答える
3

実際にはforEach()、2つのパラメーターを持つラムダを受け入れるバージョンがあります。ループ内の反復インデックスにアクセスする必要がある場合に便利です。

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

プリント:

element=10 index=0
element=11 index=1
element=12 index=2
于 2014-11-06T18:19:32.350 に答える