继续讨论Task定义
回顾一下前一篇文章的例子:
task myTask {
doLast {
println 'hello world!'
}
}
这段脚本定义了一个名为myTask的任务,并且通过一个闭包对这个任务进行了配置,给它加了一个Action。
doLast是Task的一个方法。因为这种情况很常见,所以Gradle提供了一种更加方便的写法,如下所示:
task myTask << {
println 'hello world!'
}
可以少写两行代码 :)
AST转换
AST转换也在前一篇文章里讨论过,下面是经过GradleAST转换之后的脚本:
task('myTask') << {
println 'hello world!'
}
运算符重载
理解上面这段脚本的关键点是理解Groovy的运算符重载语法。用过C++语言的人,可能会比较熟悉运算符重载。但是Groovy的运算符重载实现更接近Ruby语言:每一个可重载的运算符都跟一个普通的方法名相对应,并且调用运算符方法时,点号可以省略。上面的<<(左移)运算符,在Groovy眼里,其实就是leftShift方法:
task('myTask').leftShift({
println 'hello world!'
})
这里有leftShift的方法签名:
Task leftShift(Closure action)
从Javadoc可以看出,其作用和
doLast方法完全相同。
结论
Task定义脚本里的<<运算符,实际上是Task的leftShift方法。
举一反三
<<运算符看起来像是往左边的操作数中放入某种东西,这也是为什么Gradle会选择这个运算符来给Task添加一个Action的原因。类似,Groovy给List添加了<<运算符支持,如下所示:
def list = []
list << 1
list << 2
println list
打印出:
[1, 2]