Groovy 工作中的范围使用:典型的累加测试

这里有基本的例子来比较各种语言支持闭包的强大程度,其中之一是语言应用闭包是的范围的强大程度,第一个提出这种测试的是Paul Graham,参考(http://www .paulgraham.c om/ic ad.html),在这个测试中,他的想法十分有趣并且和可读。

他谈论了不同语言做的方式,在切换到groovy的时候你能发现好的参数。 在一些语言中,这个测试带来了戏剧性的解决方式,但在groovy中不是这样的,groovy的解决方式非常特殊并且实现简单。

这是原始需求的描述:“我们想写一个生成积聚的函数,这个函数接收一个数字n,并且返回一个函数,这个函数接收另外一个参数i,并且返回n+ i的结果”

下面是别的语言的解决方法:

在Lisp中:(defun foo (n) (lambda (i) (incf n i))) 在Perl 5中:sub foo { my ($n) = @_; sub {$n += shift} }在Smalltalk中:foo: n |s| s := n. ^[:i| s := s+i. ]下列步骤是groovy的解决方法,显示在列表5.9中:

1、 我们需要一个函数,这个函数返回一个闭包,在groovy中,我们没有函数,但是有方法(事实上,groovy中不仅有方法,还有闭包,现在我们保持足够的简单),使 用def来定义一个方法,这个方法只有一行,在方法的返回语句中创建了一个新的闭包,我们将调用foo这个方法来实现通过size进行比较的功能,createAccumulator能更好的反映出这个目的。

2、 方法需要一个初始化参数n;

3、 由于n是声明闭包的方法的一个参数,因此n可以直接在闭包中使用并且进行递增操作。

4、 递增值被计算同时也作为一个新值赋值给n,这样我们可以得到真实的累加结果。

我们增加了一些断言来检查我们的结果和展示累加器是如何被使用的,列表5.9展示了完整的代码。

在学习闭包之后,上面所有的步骤的解决方法是十分简单的。

与别的语言相比,groovy的解决方法简短而又清晰,groovy已经通过了这类语言的异常有效的测试。

这种测试与实际应用有关吗?我们也许认为在某个方面不需要一个加法生成器,但是在 不同的方面,通过这种测试意味着语言能动态的增加逻辑到一个对象并且管理这个对象的应用上下文环境,这意味着这个语言能进行十分强大的抽象。