繼續討論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]