【问题标题】:How to explain strange behaviour of Groovy's reverse ranges?如何解释 Groovy 反向范围的奇怪行为?
【发布时间】:2015-05-05 11:30:51
【问题描述】:
    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]

【问题讨论】:

  • 使用 2.4.0 一切正常。
  • 使用 2.1.7 断言失败

标签: groovy


【解决方案1】:

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

如果您还将r1 转换为java.util.ArrayList 并调用toList(),则在您使用的groovy 版本中一切正常:

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

希望对你有帮助,

【讨论】:

  • 投到列表:final r1 = (10..1) as List
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 2014-09-24
相关资源
最近更新 更多