在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());
答案 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"