天天看点

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

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|}.call(1)        # => error: (eval):1: wrong number of arguments (1 for 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