看懂Gradle脚本(四)- Groovy语法之运算符重载

看懂Gradle脚本(4)- Groovy语法之运算符重载

继续讨论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]