`

Ruby 1.9概要(4) Block和Proc

阅读更多

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的Lambda函数

    在Ruby 1.9中,Block参数现在是局部的,这意味着它们不再在Block外部可见,这增强了Block的封装性和安全性。这种改变解决了早期版本中的一些问题,使得Block的使用更加安全和灵活。 总之,Ruby 1.9对Lambda函数的...

    Programming Ruby 1.9

    9. **Proc和Lambda的区别**:在Ruby 1.9中,`Proc`和`lambda`之间的区别更加明显,特别是关于`yield`的行为,`lambda`更接近于其他函数式语言中的函数行为。 10. **内建类和模块的扩展**:Ruby 1.9对很多内建类和...

    Programming Ruby 1.9 The Pragmatic Programmers' Guide

    3. **块、Proc和Lambda**:Ruby中的块是代码块的抽象,Proc和Lambda则可以将块转化为可存储和传递的对象。理解这些概念对于编写更灵活和模块化的代码至关重要。 4. **模块和类**:Ruby的模块用于实现命名空间和混入...

    Programming-Ruby-1.9源代码

    《Programming Ruby 1.9》是一本经典的Ruby编程语言教程,其源代码包含了大量实例和示例,旨在帮助读者深入理解Ruby的语法、特性以及编程实践。这些源代码是学习和探索Ruby语言的重要资源,涵盖了从基础语法到高级...

    Ruby中的block、proc、lambda区别总结

    在规则引擎中,Ruby 的闭包使用特别频繁,而且有 block,Proc和 lambda 等后几种形式的用法,很让人困惑。为了深入理解代码,再次认真学习了一下 Ruby 的闭包,特别是 block,proc 和 lambda 几种用法的异同,这次的...

    Pragmatic.rogramming.Ruby.1.9.and.2.0.4th.Edition.pdf

    这本书主要针对Ruby 1.9和2.0版本,是Ruby开发者和学习者的重要参考资料。Ruby是一种动态、面向对象的脚本语言,以其简洁、优雅的语法和强大的元编程能力著称。 在Ruby 1.9和2.0这两个版本中,语言有许多关键性的...

    Ruby程序设计语言 (涵盖Ruby 1.8和1.9)源代码

    《Ruby程序设计语言》是Ruby的权威指南,全面涵盖该语言的1.8版和1.9版。本书详尽但并不拘泥于语言规范,既适合首次接触Ruby的资深程序员,同样也适合那些想要挑战对这门语言的理解并更深入掌握它的Ruby程序员。本书...

    ruby1.9.1文档和一本pdf

    3. **块和 Proc 对象**:Ruby 1.9 中,块可以显式赋值给 Proc 对象,使用`&`操作符,这使得块可以作为参数传递,也可以存储和稍后调用。 4. **模块命名空间**:引入了`Module#using`方法,允许将模块的定义导入到...

    Ruby中的Proc类及Proc的类方法Proc.new的使用解析

    Ruby中的Proc类是用于封装代码块(block)的对象,它允许你像操作对象一样操作代码。Proc类提供了创建和管理代码块的能力,特别是在需要在不同的上下文中调用或传递代码块时非常有用。 Proc可以通过`Proc.new`类...

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

    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中...

    ruby API资料

    3. **ruby19.chm**:这个文件可能是Ruby 1.9整体API的汇总,包含标准库和核心库的综合信息,或者可能更侧重于解释语言的高级特性和最佳实践,如元编程、Gem管理、Ruby的垃圾回收机制等。 学习和理解Ruby API有助于...

    Ruby编程语言pdf

    在对Ruby进行了简要的综述之后,本书详细介绍了以下内容:Ruby的句法和语法结构,数据结构和对象,表达式和操作符,语句和控制结构,方法、proc、lambda和闭包,反射和元编程,Ruby平台。 本书还包含对Ruby平台上...

    详解Ruby中的代码块对象Proc

    在Ruby编程语言中,代码块(block)是一种非常重要的特性,它允许程序员定义一段可执行的代码,并在需要时调用。然而,由于代码块本身不是对象,有时我们需要将其转换为对象以便于存储、传递或作为参数使用。这就是...

    Ruby新手学习书(Ruby语言中文教程)和Rails_4_days

    3. **函数与方法**:了解如何定义和调用函数,以及Ruby中的块、 Proc 和 Lambda 的使用。 4. **面向对象编程**:Ruby是一种纯面向对象的语言,你将学习类、对象、继承、模块、封装和多态等核心概念。 5. **异常...

    深入理解Ruby中的代码块block特性

    ### 深入理解Ruby中的代码块block特性 在Ruby编程语言中,代码块(block)是一种非常重要的概念,它不仅...通过这些知识点的学习,读者可以更好地理解和运用Ruby中的Block特性,从而编写出更为高效、灵活的Ruby程序。

    ruby开发文档

    它支持块(block)、闭包(closure)和 Proc 对象,使得函数式编程风格得以实现。Ruby 1.9以后引入了语法糖,如缩进代替大括号表示代码块,使代码更整洁。 3. **类与对象**:在Ruby中,类是对象的蓝图,用于创建...

    Ruby语言令人喜爱的十大特点

    6. 区块和 Lambda 表达式:Ruby 的匿名函数(lambda 和 Proc 对象)和区块(block)是其强大的函数式编程特性。它们可以用来简化代码,如处理集合或确保资源的正确关闭。Ruby 1.9 引入了更严格的 lambda,其行为更...

    笨办法学ruby_笨办法学ruby_ruby_bravevk4_

    Ruby的块(blocks)和 Proc 对象是其独特之处,它们提供了简洁的回调函数和迭代器。书中会深入解释这些概念,并通过实例展示它们在实际编程中的应用。Ruby还支持闭包,这是一种强大的工具,可以捕获和存储当前环境的...

Global site tag (gtag.js) - Google Analytics