【问题标题】:XTend For-Loop Support and Adding Range SupportXTend For-Loop 支持和添加范围支持
【发布时间】:2012-08-26 01:28:42
【问题描述】:

如果不使用 while 循环,我似乎找不到在 Xtend 中表达以下内容的好方法:

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

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

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

【问题讨论】:

    标签: for-loop foreach xtend


    【解决方案1】:

    准确的替换

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

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

    注意排他范围运算符:..&lt;

    【讨论】:

      【解决方案2】:

      你也可以用更惯用的方式来做这件事

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

      对 Xtend 来说非常新,但它让 jvm 上的编程变得很棒。

      【讨论】:

      • 请注意,您在 lambda 表达式 [] 中有一些限制,例如,如果您想访问该表达式中的局部变量 localVar,那么您将收到“无法引用非最终变量 localVar在 lambda 表达式中”。我发现 rzymek 对原始海报问题的回答更完整。
      • 如果您还需要函数内的迭代索引,请参阅下面的答案
      【解决方案3】:

      对我来说,基于范围的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()
      }
      

      【讨论】:

      【解决方案4】:

      呵呵,过了一会儿我找到了答案:

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

      【讨论】:

      • 你甚至可以避免写Integer,因为它是由 Xtend 自动推断出来的。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

        打印:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-30
          • 2016-09-29
          • 1970-01-01
          • 2016-09-01
          • 1970-01-01
          • 2011-01-03
          • 2021-03-20
          相关资源
          最近更新 更多