5

在 1.8 控制台中运行以下命令:

def accessories = null
final int prime = 31;
int result = 1;
result = prime
    * result
        + ((accessories == null) ? 0 : accessories
                .hashCode());

我收到一个编译错误,说明:

意外标记:* 在第 5 行,第 13 列

然而,当我将“* result”移到上一行时,它会编译并干净地运行。我一直在寻找解释,但到目前为止还没有运气。有人可以解释吗?

def accessories = null
final int prime = 31;
int result = 1;
result = prime * result
        + ((accessories == null) ? 0 : accessories
                .hashCode());
4

3 回答 3

6

因为 Groovy 的语句不是由 分隔;,而是由换行符分隔。它不能知道下面的行是上面行语句的延续。您可以转义换行符:

int i = 10 \
    * 9
assert i == 90

更新:

实际上,Groovy 确实从上面的行中识别出一些语句。至少点被识别:

assert [1, 2]
  .join("")
  .padLeft(4, "a") == "aa12"

一个带有+,-~(也许更多)的语句可能是方法

def m = "aa"
  - m // fails with "No signature of method: java.lang.String.negative()"
于 2013-06-10T19:36:58.637 回答
3

这是必要的,因为否则 Groovy 的解析器将不得不做更多的工作。

有很多地方,即:

String s = "tim"
             + "_yates"

解析器可以在哪里弄清楚你的意思,但在所有这些中,我相信它会涉及回溯(或实现两遍解析),这很慢

于 2013-06-10T19:38:08.593 回答
2

您只需要移动*而不是移动* result到第 4 行。

result = prime //Line completes with the assignment of prime to result
        * result //Will yield a compilation error
            + ((accessories == null) ? 0 : accessories
                    .hashCode());

反而,

result = prime * //Statement expects a RHV (right hand value) for the operator
          result + //Always end the line with an operator
            ((accessories == null) ? 0 : accessories
                    .hashCode());

要使用ternary操作员进行相同的测试,

//Yields to compilation error
def str = "ABC"             
def val = str == "ABC"
? str
: "XYZ"

//Works perfect
def val = str == "ABC" ? 
str : 
"XYZ"
于 2013-06-10T19:25:53.467 回答