对 Groovy 闭包(this、owner、delegate)
2018-04-20 本文已影响168人
4ff5e1e6459f
this 指向定义闭包的对象或静态类
owner 跟 this 一样,如果闭包定义在另一个闭包内部,owner 就指向此闭包
delegate 跟 owner 一样,但可以修改
别的语言的闭包,比如 Java,在闭包里访问变量或者调用方法,寻找这些变量和方法的顺序是:
1、闭包作用域
2、方法作用域 / 外层闭包作用域
3、类作用域
Groovy 的顺序是:
1、this
2、owner
3、delegate
在 this、owner 对象上寻找对应 Java 的 1-2-3 作用域
delegate 的意义
它的主要作用是让你在定义闭包时访问一些你不拥有的变量,例如:
闭包这个花括号就是一个闭包,在这个闭包里面访问了 minSdkVersion、targetSdkVersion、versionCode 三个变量。闭包执行时会先在 this、owner 两个对象上面寻找这三个变量,因为你没有定义这三个变量,所以最后就到 delegate 对象上去找。
defaultConfig 是 android gradle 插件定义的一个方法,你把闭包传给它,它设置闭包的 delegate 为一个配置对象,然后执行闭包。闭包执行时在 delegate (也就是这个配置对象)上找到这三个变量并修改它们。
这个闭包虽然不是在配置对象内部定义,但通过设置 delegate,它还是能修改配置对象,这就是 delegate 的意义。