内容简介:Groovy 闭包 -- Gradle教程(三)
Groovy 闭包是代码块,可以被引用、带参数、作为方法参数传递、作为返回值从方法调用返回。
语法简介
先来看看闭包的语法,如下面的所示,很简单,其中方括号表示其可省略。
{ [closureParameters -> ] statements }
closureParameters 是可选的参数列表,可以是0到多个,参数是可以有类型的,或者无类型的。如果声明了参数,那么其后面的 ->
则必须添加,用于区分参数和函数体。
再来看看一些具体的例子。
// 编号1
{ item -> item++ }
// 编号2
{ item++ }
// 编号3
{ println it }
// 编号4
{ it -> println it }
// 编号5
{ name -> println name }
// 编号6
{
String x, int y ->
println "hey ${x} the value is ${y}"
}
// 编号7
{
reader ->
def line = reader.readLine()
line.trim()
}
第一个例子,表明了一个没有类型的参数的自增操作;第二个例子是第一个例子的简写,自由一个参数时可以这样简写;第三个和第四个例子,也是同样的意思;第五个例子,是第四个例子的另一种写法,表明参数的名字可以随意规定;第六个例子,则是多类型参数的写法,其中 ${}
指引用了具体的值;第七个例子,表明表达式可以有多行。
闭包在 Groovy 中的特殊属性
闭包在 Groovy 中实际上是类型为 groovy.lang.Closure
的对象,我们来看看下面的代码。
def listener = {
e -> println "Clicked on $e.source"
}
assert listener instanceof Closure
所以,Closure 里面的方法都可以调用,例如 listener.call()
。Closure 对象中,有三类非常重要的属性,分别是 this, owner, delegate。
-
this表示定义闭包的外围类。 -
owner表示定义闭包的直接外围对象,可以是类或者闭包。 -
delegate表示一个用于处理方法调用和属性处理的第三方类。
例如我们申明一个这样的闭包。
def cl = { name.toUpperCase()}
这时候 cl 并不知道任何信息,name 是什么也不清楚。这时候就可以将 delegate 引入,将具体的逻辑委托给另一个类。
class Preson {
String name
}
def person = new Person(name: 'tom')
cl.delegate = person;
assert cl() == 'TOM'
实际示例
我们通常在使用 task 时,会在后面使用 doLast 这个函数,doLast 接受一个闭包作为参数。
task helloWorld {
doLast {
println "Hello, world!"
}
}
实际上 doLast 后面只接受一个参数,也就是闭包,如果你使用 doLast(Closure) 也是可以的。
更多信息参考 http://groovy-lang.org/closures.html
文档信息
- 版权声明:自由转载-非商用-非衍生-保持署名( 创意共享3.0许可证 )
- 发表日期:2017年1月3日
- 社交媒体:weibo.com/woaitqs
- Feed订阅: www.woaitqs.cc/feed.xml
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Groovy 闭包 -- Gradle教程(三)
- 草根学Python(十五) 闭包(解决一个需求了解闭包流程)
- [原]谈一谈闭包
- Java闭包如何工作
- 理解 JavaScript 闭包
- 管窥python闭包
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Ajax基础教程
(美)阿斯利森、(美)舒塔、金灵 / 金灵 / 人民邮电出版社 / 2006-02-01 / 35.00元
Ajax技术可以提供高度交互的Web应用,给予用户更丰富的页面浏览体验。本书重点介绍Ajax及相关的工具和技术,主要内容包括XMLHttpRequest对象及其属性和方法、发送请求和处理响应、构建完备的Ajax开发工具、使用JsUnit测试JavaScript、分析JavaScript调试工具和技术,以及Ajax开发模式和框架等。本书中所有例子的代码都可以从Apress网站本书主页的源代码(Sou......一起来看看 《Ajax基础教程》 这本书的介绍吧!