无括号的Groovy范围迭代

无括号的Groovy范围迭代,groovy,Groovy,下面的Groovy代码打印从1到5的数字范围 (1..5).each {println it} 但是,当我忘记添加括号并执行以下操作时: 1..5.each { println it} 它只印5张 为什么这是合法的Groovy语法?我希望它要么表现为(1..5)版本,要么抛出一个异常,说我忘记了括号。5。在Groovy解析器中,每个都比1..5具有优先级。它之所以有效,是因为它正在做这样的事情: ret = 5.each { println it } range = 1..ret asser

下面的Groovy代码打印从1到5的数字范围

(1..5).each {println it}
但是,当我忘记添加括号并执行以下操作时:

1..5.each { println it}
它只印5张


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

5。在Groovy解析器中,每个
都比
1..5
具有优先级。它之所以有效,是因为它正在做这样的事情:

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

每个
的返回是集合本身

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

运算符重载

运算符的优先级继承权(其中一些我们还没有研究过)从最高到最低: $(范围转义)

new()(括号)
[](订阅)(方法调用){}(可关闭块)[](列表/映射)
. ?. *. (点)
~ ! $ ()(铸造型)
**(电源)
++(前/后)——(前/后)+(一元)——(一元)
* / %
+(二进制)-(二进制)
> >>> .. ..<
<>=在as中的实例
== != 
&
^
|
&&
||
?:
= **= *= /= %= += -= = >>>= &= ^= |=

.each
的绑定强度可能大于
,因此第二个命令相当于
1..(5.each{println it})
,其中范围未使用。
  new ()(parentheses)
  [](subscripting) ()(method call) {}(closable block) [](list/map)
  . ?. *. (dots)
  ~ ! $ ()(cast type)
  **(power)
  ++(pre/post) --(pre/post) +(unary) -(unary)
  * / %
  +(binary) -(binary)
  << >> >>> .. ..<
  < <= > >= instanceof in as
  == != <=>
  &
  ^
  |
  &&
  ||
  ?:
  = **= *= /= %= += -= <<= >>= >>>= &= ^= |=