如果一个闭包被赋值给一个对象的属性(在脚本中,给一个没有定义过的变量赋值,实际上就是给这个脚本对象添加了一个属性),那么当需要对这个闭包进行递归调用的时候,可以直接使用这个属性的名字进行调用:
// 递归求n!
factorialProperty = { n ->
if (n == 0) return 1
n * factorialProperty(n - 1) // 使用这个属性的名字进行递归调用
}
assert 3628800 == factorialProperty(10)
如果把闭包赋值给一个局部变量,那么就必须先定义这个变量,再进行赋值:
def factorialVar // 先定义
factorialVar = { n -> // 再赋值
if (n == 0) return 1
n * factorialVar(n - 1) // 使用这个局部变量的名字进行递归调用
}
assert 3628800 == factorialVar(10)
但是,如果要在定义局部变量的同时,用闭包初始化这个变量,那么就没有办法使用上面的方法了。这是因为这个闭包先于这个局部变量被定义,所以在这个闭包被定义的时候,在它的上下文中并没有这个局部变量。
在这种情况下,可以通过Closure的
call方法实现递归调用:
def factorialVar = { n ->
if (n == 0) return 1
n * call(n - 1) // 使用call方法实现递归调用
// n * factorialVar(n - 1) // 错误
}
assert 3628800 == factorialVar(10)
call方法同样可以用于匿名闭包:
assert 3628800 == { n -> n == 0 ? 1 : n * call(n - 1) }(10)
事实上,call方法可以用在任何闭包的递归调用上。
以上代码在Groovy 1.5.7中测试通过。
分享到:
相关推荐
Groovy 学习笔记 Groovy 学习笔记
Groovy
在学习任何东西之前,最重要的是培养兴趣,Groovy世界最耀眼的技术之一--Grails相信大家早已耳闻,我将通过Grails实战系列文章 向您展现Grails的迷人风采,使您感受到Grails的魅力,以至疯狂地爱上Grails,并坠入...
Groovy 调用 Java 类groovy 调用 Java class 十分方便,只需要在类前导入该 Java 类,在 Groovy 代码中就可以无缝使用该
Groovy学习笔记,内容如下: 1.概念 2.基本语法 3.字符串 4.集合 5.类和闭包 6.控制语句 7.操作符重载 8.I/O操作 9.高级应用 10.正则表达式
对Groovy开发环境设置,基本语法做了简单明了的介绍
图文并茂,适合入门新手,涵盖了基本的语法讲解及一些DEMO测试,值得一看
NULL 博文链接:https://rsljdkt.iteye.com/blog/859059
第1章 数字和字符串 第2章 List的简单介绍 第3章 String的特殊用法 第4章 闭包 第5章 集合+闭包 第6章 Map和Range 第7章 函数
Groovy_笔记
groovy(10)-闭包委托策略 /*闭包的三个重要变量:this,owner,delegate区别在于:this代表闭包定义处最近的对象(不包含闭包),ow
Groovy语法&Gradle配置学习笔记
NULL 博文链接:https://key232323.iteye.com/blog/1336400
Java调用Groovy,实时动态加载数据库groovy脚本,java读取mongoDB的groovy脚本,加载实时运行,热部署
Java中使用Groovy的三种方式,详细见我的博客。
很好的学习Groovy的学习资料, 很实用。。 个人感觉Groovy是Java敏捷开发的首选。
Grails Groovy 学习必备参考资料
Groovy学习资料-中文.rar。Groovy学习资料。Grails学习资料。mht网页格式。
groovy-se-study 本工程用于学习groovy和java-se的调用