Gradle学习之旅(二) -- 闭包

本文深入探讨了Gradle中闭包的概念,包括其语法、如何作为方法参数传递、如何使用参数,以及闭包中的delegate、thisObject和owner等重要概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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不可以被改变, 且thisObjectthis都表示调用闭包的类

//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 任务执行时的闭包
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值