天天看點

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