1、Proc加了新方法Proc#yield
,这只是Proc#call的别名方法,是为了能让Proc也可以像block那样传入方法并且调用yield。
<!---->a_proc
=
Proc.new {
|
a,b
|
a
+
b}
a_proc.
yield
(
1
,
2
)
#
=> 3
def
test(
&
block)
block.
yield
(
1
,
2
,
3
)
end
test do
|
a,b
|
a
+
b
#
=> 3
end
test
&
a_proc
#
=>3
2、没有参数的block的基数
(参数个数,arity):
1.8
<!---->lambda
{}.arity
#
=> -1
1.9
<!---->lambda
{}.arity
#
=> 0
所谓arity就是方法调用无法忽略的参数个数。这跟Erlang,Prolog中的arity的概念并无二致。
3、proc关键字现在是Proc.new的同义词
,proc在1.8的时候跟lambda关键字是同义词,也就是proc定义的是一个lambda而非字面
意义上的Proc,1.9改过来了。
1.9:
<!---->
proc{
|
a,b
|
}.arity
#
=> 2
proc{
|
a,b
|
}.call(
1
)
#
=> nil
Proc.new{
|
a,b
|
}.arity
#
=> 2
Proc.new{
|
a,b
|
}.call(
1
)
#
= nil
1.8:
<!---->proc{
|
a,b
|
}.arity
#
=> 2
proc{
|
a,b
|
}.call(
1
)
#
=> ERROR: (eval):1: wrong number of arguments (1 for 2)
Proc.new{
|
a,b
|
}.arity
#
=> 2
Proc.new{
|
a,b
|
}.call(
1
)
#
=> nil
1.8时候第二个调用出错的原因在于lambda在调用参数过多过少的时候都将报error,这是lambda跟Proc的一个区别之一。
4、Proc#lambda?
用来判断某个Proc是否具有lambda语义或者block语义:
<!---->lambda
{}.
lambda
?
#
=>true
proc{}.
lambda
?
#
=>false
Proc.new{}.
lambda
?
#
=>false
分享到:
相关推荐
在Ruby 1.9中,Block参数现在是局部的,这意味着它们不再在Block外部可见,这增强了Block的封装性和安全性。这种改变解决了早期版本中的一些问题,使得Block的使用更加安全和灵活。 总之,Ruby 1.9对Lambda函数的...
9. **Proc和Lambda的区别**:在Ruby 1.9中,`Proc`和`lambda`之间的区别更加明显,特别是关于`yield`的行为,`lambda`更接近于其他函数式语言中的函数行为。 10. **内建类和模块的扩展**:Ruby 1.9对很多内建类和...
3. **块、Proc和Lambda**:Ruby中的块是代码块的抽象,Proc和Lambda则可以将块转化为可存储和传递的对象。理解这些概念对于编写更灵活和模块化的代码至关重要。 4. **模块和类**:Ruby的模块用于实现命名空间和混入...
《Programming Ruby 1.9》是一本经典的Ruby编程语言教程,其源代码包含了大量实例和示例,旨在帮助读者深入理解Ruby的语法、特性以及编程实践。这些源代码是学习和探索Ruby语言的重要资源,涵盖了从基础语法到高级...
在规则引擎中,Ruby 的闭包使用特别频繁,而且有 block,Proc和 lambda 等后几种形式的用法,很让人困惑。为了深入理解代码,再次认真学习了一下 Ruby 的闭包,特别是 block,proc 和 lambda 几种用法的异同,这次的...
这本书主要针对Ruby 1.9和2.0版本,是Ruby开发者和学习者的重要参考资料。Ruby是一种动态、面向对象的脚本语言,以其简洁、优雅的语法和强大的元编程能力著称。 在Ruby 1.9和2.0这两个版本中,语言有许多关键性的...
《Ruby程序设计语言》是Ruby的权威指南,全面涵盖该语言的1.8版和1.9版。本书详尽但并不拘泥于语言规范,既适合首次接触Ruby的资深程序员,同样也适合那些想要挑战对这门语言的理解并更深入掌握它的Ruby程序员。本书...
3. **块和 Proc 对象**:Ruby 1.9 中,块可以显式赋值给 Proc 对象,使用`&`操作符,这使得块可以作为参数传递,也可以存储和稍后调用。 4. **模块命名空间**:引入了`Module#using`方法,允许将模块的定义导入到...
Ruby中的Proc类是用于封装代码块(block)的对象,它允许你像操作对象一样操作代码。Proc类提供了创建和管理代码块的能力,特别是在需要在不同的上下文中调用或传递代码块时非常有用。 Proc可以通过`Proc.new`类...
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中...
3. **ruby19.chm**:这个文件可能是Ruby 1.9整体API的汇总,包含标准库和核心库的综合信息,或者可能更侧重于解释语言的高级特性和最佳实践,如元编程、Gem管理、Ruby的垃圾回收机制等。 学习和理解Ruby API有助于...
在对Ruby进行了简要的综述之后,本书详细介绍了以下内容:Ruby的句法和语法结构,数据结构和对象,表达式和操作符,语句和控制结构,方法、proc、lambda和闭包,反射和元编程,Ruby平台。 本书还包含对Ruby平台上...
在Ruby编程语言中,代码块(block)是一种非常重要的特性,它允许程序员定义一段可执行的代码,并在需要时调用。然而,由于代码块本身不是对象,有时我们需要将其转换为对象以便于存储、传递或作为参数使用。这就是...
3. **函数与方法**:了解如何定义和调用函数,以及Ruby中的块、 Proc 和 Lambda 的使用。 4. **面向对象编程**:Ruby是一种纯面向对象的语言,你将学习类、对象、继承、模块、封装和多态等核心概念。 5. **异常...
### 深入理解Ruby中的代码块block特性 在Ruby编程语言中,代码块(block)是一种非常重要的概念,它不仅...通过这些知识点的学习,读者可以更好地理解和运用Ruby中的Block特性,从而编写出更为高效、灵活的Ruby程序。
它支持块(block)、闭包(closure)和 Proc 对象,使得函数式编程风格得以实现。Ruby 1.9以后引入了语法糖,如缩进代替大括号表示代码块,使代码更整洁。 3. **类与对象**:在Ruby中,类是对象的蓝图,用于创建...
6. 区块和 Lambda 表达式:Ruby 的匿名函数(lambda 和 Proc 对象)和区块(block)是其强大的函数式编程特性。它们可以用来简化代码,如处理集合或确保资源的正确关闭。Ruby 1.9 引入了更严格的 lambda,其行为更...
Ruby的块(blocks)和 Proc 对象是其独特之处,它们提供了简洁的回调函数和迭代器。书中会深入解释这些概念,并通过实例展示它们在实际编程中的应用。Ruby还支持闭包,这是一种强大的工具,可以捕获和存储当前环境的...