閱讀941 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

最後更新:2017-05-18 11:01:53

  上一篇:go  Ruby 1.9概要(5) 異常
  下一篇:go  無法抗拒Minecraft給予超高的自由度和探索-微訪談