为什么意外的令牌:*在做两行操作时

时间:2013-06-10 18:57:51

标签: groovy

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

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

我收到编译错误说明:

意外令牌:*在第5行,列:13

然而,当我将“*结果”移动到前一行时,它会编译并运行得很干净。我搜索过试图找到一个解释,但到目前为止没有运气。有人可以解释一下吗?

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

3 个答案:

答案 0 :(得分:6)

因为Groovy的语句不是由;分隔,而是由换行符分隔。它无法知道下面的行是上面一行语句的延续。你可以逃脱换行符:

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

<强>更新

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

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

包含+-~(以及更多)could be methods的声明:

def m = "aa"
  - m // fails with "No signature of method: java.lang.String.negative()"

答案 1 :(得分:3)

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

有许多地方,即:

String s = "tim"
             + "_yates"

解析器可以解决你的意思,但在所有这些中,我相信它会涉及backtracking(或实现两遍解析),这很慢

答案 2 :(得分: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"