如何解释Groovy反向范围的奇怪行为?

时间:2015-05-05 11:30:52

标签: groovy

    println GroovySystem.version
    final r = (1..10).reverse()
    final r1 = (10..1)
    assert r == r1
    assert r.takeWhile { it > 5 } == r1.takeWhile { it > 5 }

第二个断言失败

2.2.2
Exception in thread "main" Assertion failed: 

assert r.takeWhile { it > 5 } == r1.takeWhile { it > 5 }
       | |                    |  |  |
       | [10, 9, 8, 7, 6]     |  |  [5, 4, 3, 2, 1]
       |                      |  [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
       |                      false
       [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

1 个答案:

答案 0 :(得分:1)

当您使用(10..1)时,您有一个groovy.lang.IntRange,而当您对其应用reverse()时,会得到java.util.ArrayList个结果。当你对它应用takeWhile()时,似乎两种类型的行为都不同;至少我测试的2.1.72.3.7版本(或2.2.2作为OP评论),而2.4.32.4.0没有问题@Opal评论。所以在groovy上似乎是一个固定的错误。

如果您还将r1转换为调用java.util.ArrayList的{​​{1}},则所有内容在您正在使用的groovy版本中都能正常运行:

toList()

希望这有帮助,