Ruby中使用Block、Proc、lambda实现闭包
闭包(closure),是指未绑定到任何对象的*代码,闭包中的代码与任何对象和全局变量无关,只与执行此段代码的上下文相关。
今天我们简要的看一下ruby中的闭包实现。
ruby中的闭包实现有:block,proc,lambada。
首先,我们来看block。
ary = [1,2,3,4]
ary.collect! do |a|
a*a
end
ary.each do |a|
puts a
end
这段代码,我们使用了array对象的block方法,将ary中的每个元素平方一把。从例子中我们可以看到block使用起来很方便,想必传统的java以及c编码,省略掉了冗余的循环,让你更加专注业务代码,这也是ruby的好处之一。
使用block的最大好处就是可以省略重复的冗余的无用的代码,我们再来看一个读文件的例子:
#file block
file.open(__file__) do |f|
puts f.readlines
end
对比我们用java代码来读文件,每次都很反感那个冗长的try-catch-finally。从上面的ruby代码中我么可以看到,ruby语言给你做了处理,通过block你可以不用写无用的系统代码了。
从上面的例子我们可以看到,ruby中的block对开发者来说,不用再写那些冗余无用的系统代码,而是更加专注业务代码,提升开发效率。
其次,我们再看proc。
如果你经常使用block,你会发现一个问题:代码中会有很多重复的block,比如好多地方需要打印文件内容。怎么解决呢?你第一个想到的是写一个公共函数,不错,可以解决。但是记住你使用的是ruby语言,不要重新造*。ruby提供了函数化的block:proc。
我们看一个简单的proc例子:
#file block with proc
p = proc.new{|f| puts f.readlines}
file.open(__file__, &p)
上面例子可以看到,将block代码定义为一个proc对象,然后在使用block的地方用proc替换,这样就做到了完美的代码复用。
最后我们看看lambda。
lambda是一种表达式的名称,ruby中可以通过lambda表达式创建proc对象。我们先看例子:
#file block with proc created with lambda
new_p = lambda{|f| puts f.readlines}
file.open(__file__, &new_p)
上面例子中,我们使用系统的lambda方法创建了一个proc对象,其效果与proc.new创建出来的是一样的。其实使用lambda与使用proc.new效果是一样的,只不过lambda是一种标准的方法,其他语言如python也支持,因此ruby中也支持了。
上一篇: 数组标记法在算法题中的应用
下一篇: Vue兼容ie9的问题全面解决方案