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
文章转自庄周梦蝶  ,原文发布时间 2008-10-02
目录
相关文章
|
10月前
|
Ruby
浅谈Ruby中的block, proc, lambda, method object的区别
浅谈Ruby中的block, proc, lambda, method object的区别
61 0
|
Ruby 容器
【Ruby on Rails全栈课程】2.7 块(Block)和迭代器
1、块(Block) 块是ruby 的一个独特特性,是一种可以和方法调用相关联的代码块。 是在花括号{}或者do…end之间的一组代码,一般我们在单行中block用花括号{},在多行中用do…end (1)块的格式
95 0
ruby的方法和block
在ruby中方法与block的合用 :~/ruby$ irbirb(main):001:0> def take_block(p1)irb(main):002:1>   if block_given?irb(main):003:2>      yield(p1)irb(main):004:2>   ...
614 0
|
Go Ruby
Ruby学习笔记-Block, Proc and Lambda
1.Block:   Ruby中的块就是由多行代码组成的一个代码块,通常可以把它认为是一个匿名方法,常用来迭代一个数组或范围(如each, times方法);语法格式如下:   {                       //code   }             OR   do...
691 0
|
2月前
|
Ruby
|
1月前
|
数据采集 Web App开发 数据处理
Ruby网络爬虫教程:从入门到精通下载图片
Ruby网络爬虫教程:从入门到精通下载图片
|
2月前
|
JSON 数据格式 Ruby