为什么不能处理花括号呢?

时间:2017-06-26 22:23:48

标签: groovy android-gradle indentation curly-braces

在Android Studio(可能是ANY)gradle文件中,以下代码有效:

task build {
}

一个小小的改变导致完全崩溃:

task build
{
}

之前已经出现过其他线程,但是在修复构建文件的上下文中。我的问题是为什么不能用gradle / groovy来处理任何支撑风格?许多其他语言都可以很好地应对它,那么这里有什么重要意义呢?

2 个答案:

答案 0 :(得分:4)

在错误消息中它实际上就可以了:

build file '.../build.gradle': 80: Ambiguous expression could be a parameterless closure expression, an isolated open code block, or it may continue a previous statement;
     solution: Add an explicit parameter list, e.g. {it -> ...}, or force it to be treated as an open block by giving it a label, e.g. L:{...}, and also either remove the previous newline, or add an explicit semicolon ';' @ line 80, column 1.

由于Groovy语法糖使用lambda作为最后一个参数外观行语言构造的方法,以下代码块:

task build {}
task build2(type: Copy) {}

等于更常规的形式:

task build({})
task build(type: Copy, {})

现在,你真的不希望那里的那些花括号分隔常规代码块,而是一个Groovy lambda,它应该作为参数传递给build方法。

然而从它的外观来看,Groovy无法确定它是否真的是一个lambda作为参数传递给前一行中的方法,或者当你在其间放置一个换行符时不相关的代码块。然后你去了,错误消息中描述的模棱两可,就在那里。

根据错误消息中的建议,您还可以使用以下语法而不是转义换行符的语法:

task build
{ -> 
}

最后,用于调用动态方法的task关键字(在您的示例中名为build)不是特定于Groovy的,而是Gradle DSL功能。

答案 1 :(得分:2)

如果读到这篇文章的人都在想,那么解决方法很简单。

static_asserts

我只是想知道“为什么”......