没有括号的Groovy范围迭代

时间:2014-09-29 12:35:55

标签: groovy

以下Groovy代码打印1到5的数字范围。

(1..5).each {println it}

但是,当我忘记添加括号时,请执行以下操作:

1..5.each { println it}

只打印5

为什么这种合法的Groovy语法?我希望这可以表现为(1..5)版本或抛出一个异常,说我忘记了括号。

2 个答案:

答案 0 :(得分:3)

5.each优先于Groovy解析器中的1..5。它的工作原理是因为它做了这样的事情:

ret = 5.each { println it }
range = 1..ret
assert range == [1, 2, 3, 4, 5]

each的回归是集合本身

答案 1 :(得分:3)

. - 运算符在groovy中的优先级高于.. Source

  

运算符重载

     

运营商的优先级层次结构,其中一些我们还没有看过,从最高到最低:   $(范围转义)

  new ()(parentheses)
  [](subscripting) ()(method call) {}(closable block) [](list/map)
  . ?. *. (dots)
  ~ ! $ ()(cast type)
  **(power)
  ++(pre/post) --(pre/post) +(unary) -(unary)
  * / %
  +(binary) -(binary)
  << >> >>> .. ..<
  < <= > >= instanceof in as
  == != <=>
  &
  ^
  |
  &&
  ||
  ?:
  = **= *= /= %= += -= <<= >>= >>>= &= ^= |=