Gradle学习之旅(一) – 基础语法笔记
Gradle学习之旅(二) – 闭包
闭包是 gradle 中的一个重要概念, 说的通俗易懂一些, 跟 java中的匿名内部类, ObjectC 中的 block 有点像
但也并非完全一样, 闭包有它自己独有的概念
闭包的写法
def closure = {
println "I'm a closure"
}
如上述代码, 一个大括号就是一个闭包, 写法非常简单
- 闭包可以赋值给一个变量, 如上代码所示
- 闭包也可以当做方法的参数传递:
def add(Closure closure){ closure() } add { println "closure is method params" }
给闭包传递参数
def add(def closure){
closure("I am params")
}
def add2(def closure){
closure(1, "I am params 2")
}
add {
println it
}
add2 {index, string ->
println index
println string
}
- 给闭包传参格式为:
闭包名(闭包参数)
, 多个参数之间用,
分割 - 使用给闭包传递的参数:
- 如果只有一个参数, 用
it
来使用这个参数 - 如果有多个参数, 在
{
后使用参数名1, 参数名2 ->
来声明这个参数, 通过参数名来使用声明后的参数
- 如果只有一个参数, 用
闭包 – groovy.lang.Closure
闭包其实就是一个类: groovy.lang.Closure
, 也就是说闭包也可以直接通过new Closure()
来创建。
delegate:Closure
中有一个非常重要的成员变量delegate
, 如果不进行设置, delegate
的默认值是调用闭包的类, 在闭包中我们可以通过delegate.xxx()
来访问delegate
中的方法和成员变量, 也可以直接xxx()
(省略delegate.
)来访问:
//delegate Demo
task DelegateDemo2 <<{
delegateMethod {
println delegate.tag
tag = "你好"
println delegate.tag
println tag
}
}
def delegateMethod(closure){
closure.delegate = new DemoDelegate()
closure()
}
class DemoDelegate{
String tag = "未知"
}
--------------- 打印结果:
未知
你好
你好
thisObject: thisObject
不可以被改变, 且thisObject
和this
都表示调用闭包的类
//thisObject Demo
task ThisObjectDemo <<{
closureMethod {
println thisObject.getClass()
println this.getClass()
closureMethod {
println thisObject.getClass()
println this.getClass()
}
}
}
def closureMethod(closure){
closure()
}
----------------------- 打印结果:
class Demo_5qgwz76l2dmlvp6bj3kbtpav4
class Demo_5qgwz76l2dmlvp6bj3kbtpav4
class Demo_5qgwz76l2dmlvp6bj3kbtpav4
class Demo_5qgwz76l2dmlvp6bj3kbtpav4
注: "Demo_5qgwz76l2dmlvp6bj3kbtpav4" 是代码所在 Demo.gradle 文件的 Class 对象
owner: 表示定义闭包的类或闭包, 与 thisObject
不同的是, thisObject
不能是闭包, 而 owner
有可能是闭包
//owner Demo
def ownerClosure = {
println owner.getClass()
}
task OwnerDemo <<{
ownerClosure()
closureMethod {
println owner.getClass()
closureMethod {
println owner.getClass()
}
}
}
def closureMethod(closure){
closure()
}
---------------- 打印结果:
class Demo_5qgwz76l2dmlvp6bj3kbtpav4
class Demo_5qgwz76l2dmlvp6bj3kbtpav4$_run_closure6
class Demo_5qgwz76l2dmlvp6bj3kbtpav4$_run_closure6$_closure15
注: Demo_5qgwz76l2dmlvp6bj3kbtpav4$_run_closure6 是OwnerDemo 任务执行时的闭包