9

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

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

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

  • 有没有更好的方法来完成上述操作?我在他们的文档中没有看到任何有希望的东西
  • 该语言的大部分功能只是 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

实际上有一个版本forEach()接受带有两个参数的 lambda。如果您需要访问循环内的迭代索引,这很有用。

(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 回答
3

Xtend 2.6开始,我们也支持“传统”的 for 循环,就像在 Java 中一样。

于 2014-06-16T06:44:56.863 回答