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