首页IT科技golang包循环依赖(Groovy 闭包_胖子的家_百度空间)

golang包循环依赖(Groovy 闭包_胖子的家_百度空间)

时间2025-05-03 23:28:59分类IT科技浏览5001
导读:2008-03-04 15:28...

2008-03-04 15:28

闭包

Groovy 中最令人兴奋和最强大的功能是支持闭包             。闭包(Closure)类似于 Java 语言中的匿名内部类                   。闭包和匿名内部类都是可执行的一段代码            ,不过这两者之间有一些细微的不同      。状态是自动传入传出闭包的         。闭包可以有名字                   。它们可以重复使用         。而且                   ,最重要且对 Groovy 同样成立的是       ,闭包远比匿名内部类要灵活得多!闭包用以下方法定义:

{[comma-separated-Arguments-list ->] statements }

闭包用“{}             ”括起         ,“->                   ”前面是参数                  ,后面是处理语句      。下面的例子演示了如何定义并使用一个闭包                   。第一个闭包演示了在字符串中使用参数的形式:${param};第二个闭包演示了多参数形式:用逗号隔离参数            。

closure = { name -> println("hello ${name}") } closure.call("world!") closure = { greeting, name -> println(greeting + name) } closure("hello ", "world!")

有趣的是          ,闭包至少会有一个参数 “it      ”      ,它其实是参数表中的第一个参数                  ,所以如果闭包定义中只有一个参数             ,可以省略不写   ,而使用缺省的参数“it         ”   。对于没有参数定义的闭包                  ,“it                   ”的值就是 null                    。

closure = { println "hello " + it } closure("world!")

例子 9 展示了闭包的强大功能               。新改进的 Dog 类包括一个 train 方法                ,它实际上执行创建了 Dog 实例的闭包。

class Dog{ def train(action){ action.call() } } sit = { println "Sit, Sit! Sit! Good dog"} myDog = new Dog() myDog.train(sit) //prints Sit, Sit! Sit! Good dog mollie = new Dog() mollie.train { println "Down! DOWN!" } //prints DOWN! DOWN!

在上面的例子里,我们还看到               ,闭包通过 call() 方法被调用                。(在底层                   ,call() 方法实现了对闭包隐含的doCall()方法的调用)                  。Groovy 中的大多数对象具有像 each 和 find 这样的以闭包为参数的方法   。用闭包来迭代对象会产生几种令人兴奋的可能性:

[2, 4, 6, 8, 3].find { x | if (x == 3){ println x } }

其实就是:(你也许已经发现   ,可以用it代替x)

myFinder={ x | if(x==3) println x } [2,4,6,8,3].find(myFinder)

这里我们使用了一个 Groovy-Beta3 闭包定义            ,只是为了让您能看懂老版本Groovy的一些例子             。在新的Groovy JSR中对闭包的定义略有改动                   ,因为 | 字符同时也是 Java 中的位操作符;Groovy JSR 建议使用 Nice (另外一种JRE语言)样式的 -> 分隔符代替它                   。

这种以闭包为参数的代码在Groovy里十分普遍:

//each (1..100).each{ println it} //times 1000.times{ println it} //values go from 0 to 9999 //upto 1.upto(1000){ println it} //step 1.step(1001,1){ println it} //values go from 1 to 1000;
声明:本站所有文章       ,如无特殊说明或标注         ,均为本站原创发布      。任何个人或组织                  ,在未征得本站同意时          ,禁止复制            、盗用                   、采集       、发布本站内容到任何网站         、书籍等各类媒体平台         。如若本站内容侵犯了原著者的合法权益      ,可联系我们进行处理                   。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
用u盘装系统会影响其他盘吗(u盘装系统有哪些常见问题?u盘装系统注意事项详解)