当前位置: 首页 > 编程笔记 >

Ruby中使用Block、Proc、lambda实现闭包

全丰
2023-03-14
本文向大家介绍Ruby中使用Block、Proc、lambda实现闭包,包括了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中也支持了。

 类似资料:
  • 本文向大家介绍Ruby中的block、proc、lambda区别总结,包括了Ruby中的block、proc、lambda区别总结的使用技巧和注意事项,需要的朋友参考一下 在规则引擎中,Ruby 的闭包使用特别频繁,而且有 block,Proc和 lambda 等后几种形式的用法,很让人困惑。为了深入理解代码,再次认真学习了一下 Ruby 的闭包,特别是 block,proc 和 lambda 几

  • 本文向大家介绍Ruby中的Proc类及Proc的类方法Proc.new的使用解析,包括了Ruby中的Proc类及Proc的类方法Proc.new的使用解析的使用技巧和注意事项,需要的朋友参考一下 Proc是对块及其context(局部变量的作用域以及栈框架)进行对象化处理之后得到的过程对象。您可以像使用无名函数那样来使用Proc,但它不会导入局部变量的作用域(可以把动态局部变量用作Proc局部变量

  • 本文向大家介绍Ruby中Block和迭代器的使用讲解,包括了Ruby中Block和迭代器的使用讲解的使用技巧和注意事项,需要的朋友参考一下 我们来简单地描述Ruby的一个独特特性。Block,一种可以和方法调用相关联的代码块,几乎就像参数一样。这是一个不可思议的功能强大的特性。 可以用Block实现回调(但它比Java的匿名内部(anonymous inner)类更简单),传递一组代码(但它远比c

  • 本文向大家介绍在Java中如何使用lambda实现LongUnaryOperator?,包括了在Java中如何使用lambda实现LongUnaryOperator?的使用技巧和注意事项,需要的朋友参考一下 LongUnaryOperator是一个java.util.function函数接口。此函数接口接受单个长值操作数并生成长值结果。LongUnaryOperator接口可以用作lambda表达

  • 本文向大家介绍Java中使用Lambda表达式实现IntBinaryOperator,包括了Java中使用Lambda表达式实现IntBinaryOperator的使用技巧和注意事项,需要的朋友参考一下 IntBinaryOperator 是Java 8 中java.util.function包中的功能接口。该接口需要两个int类型的参数作为输入, 并产生一个int类型的结果。IntBinaryO

  • 问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 5年前关闭。 改善这个问题 我想用Java实现ActiveRecord的实现,在设计自己的Java之前,我想知道是否有开源的实现。 我知道其他成功的Java OR映射工具,例如Hibernate,Castor等…,那不是我想要的,我想要一个ActiveRe