XTend For-Loop支持和添加范围支持

Bfa*_*ace 9 foreach for-loop xtend

我似乎无法找到一种在Xtend中表达以下内容的好方法,而不需要使用while循环:

for(int i = 0; i < 3; i++){
    println("row ");
}
println("your boat");
Run Code Online (Sandbox Code Playgroud)

所以,我猜我的问题有两个部分:

  • 有没有更好的方法来做到这一点?我在他们的文件中没有看到任何有希望的东西
  • 该语言的很大一部分功能只是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
}
}
Run Code Online (Sandbox Code Playgroud)

rzy*_*mek 17

确切的替代品

for(int i = 0; i < 3; i++){
    println("row ");
}
Run Code Online (Sandbox Code Playgroud)

for (i : 0 ..< 3) {
    println("row ")
}
Run Code Online (Sandbox Code Playgroud)

注意独家范围运算符: ..<


Del*_*ney 14

你也可以用惯用语来做

(1..3).forEach[println("row")]
Run Code Online (Sandbox Code Playgroud)

对于Xtend来说很新,但是它让它在jvm上编程非常棒.


Dov*_*val 5

对我来说,基于范围forEach意味着范围在某种程度上是有意义的.为了在没有迭代变量的情况下循环特定次数,我发现Ruby的times循环更清楚地表达了意图:

3.times [|println("row")]
Run Code Online (Sandbox Code Playgroud)

可悲的是,它不是其中的一部分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()
}
Run Code Online (Sandbox Code Playgroud)