在Ruby1.9使用Proc的乐趣
Saturday, October 18th, 2008original from: Fun with Procs in Ruby 1.9
author: Dave Thomas
translator:g.zhen.ning
在Ruby1.9里,添加了一些新功能给Proc对象。
Curry是一个有能力让函数接受n个参数并且从原函数里生成一个或多个带有预设定的参数。在Ruby1.9,你可以通过调用curry方法创建一个curry-able的proc。如果你随后调用这个超过它预期参数的curry的proc,它将不会执行。少于则返回一个带有绑定传入参数值的proc。
让我们看下面这个试验例子,这个proc仅添加两个值:
plus = lambda {|a,b| a + b}
puts plus[1,2]
在这例子里我使用[ ]操作符调用带有参数的proc,参数分别是1和2,这代码会输出3。
下面这例子更有趣~
curried_plus = plus.curry
# create two procs based on plus, but with the first parameter
# already set to a value
plus_two = curried_plus[2]
plus_ten = curried_plus[10]
puts plus_two[3]
puts plus_ten[3]
在第一行代码里,我创建了一个proc的plus的curry版本,然后调用它两次,但两次我都只传递一个参数。这意味着它不能执行里面的代码。取而代之的是返回了一个和原来proc有点相似的新proc,但这两个新proc的参数分别为2和10。在最后两行代码,我调用这两个新proc,补全缺失参数后,这意味着他们可以正常执行,最后这两行代码输出5和13。
过了这个星期,Matz添加了一个新方法到Proc类。你可以使用Proc#===作为Proc.call的别名。因此,你会使用这来干些什么呢?嘻,还记得===是用来在case语句里匹配是吧。在AimRed blog里,他注解了这个功能可以用来匹配case语句执行代码。在他的例子里,他手动添加===方法到Proc类里。
class Proc
def ===( *parameters )
self.call( *parameters )
[...]
Tags: Proc
Posted in Uncategorized | 1 Comment »>