2009-11-25 43 views
6

我不知道任何Ruby,現在正在閱讀一些文檔。 我剛剛閱讀了關於使用代碼塊並且「yield」關鍵字的一個疑問,那就是是否可以將多個代碼塊傳遞給一個函數,並且可以在被調用的函數中同時使用這兩個代碼塊。如何將更多的代碼塊傳遞給Ruby中的函數?

回答

9

一次只能傳遞一個塊,但塊實際上是Proc實例,並且您可以傳遞許多希望作爲參數的實例。

def mymethod(proc1, proc2, &block) 
    proc1.call 
    yield if block_given? 
    proc2.call 
end 

mymethod(Proc.new {}, Proc.new {}) do 
    # ... 
end 

然而,它很少有意義。

+1

塊不完全是過程。他們有共同的使用情況和語法,但他們有足夠的實現差異導致混淆行爲。這有點迂腐,但範圍的差異已經讓我陷入了困境。 – fengb 2009-11-25 14:25:49

+0

@fengb我剛做了一個測試。 http://gist.github.com/242746您是否有更多關於Proc和block之間差異的文檔? Ruby告訴我一個塊是Proc。 – 2009-11-25 14:31:51

+0

通過使用&var語法,塊被隱式地「typecasted」處理。但是,某些操作在作爲塊與proc使用時表現出不同的行爲。 冗長而全面的比較: http://innig.net/software/ruby/closures-in-ruby.rb – fengb 2009-11-25 15:00:11

1

在句法上,使用yield語句只支持一個傳遞給該函數的代碼塊。當然,您可以傳遞多個其他函數或「代碼塊對象」(Proc對象)的函數,並使用它們,但不能簡單地使用yield

1

您可以創建Proc對象並傳遞儘可能多的數據。

我推薦閱讀this page來理解Ruby所有不同的塊和閉包構造的細微之處。

1

可以使用call方法,而不是產量,以處理傳入了兩個獨立的模塊

方法如下:。

def mood(state, happy, sad) 
    if (state== :happy) 
    happy.call 
    else 
    sad.call 
    end 
end 

mood(:happy, Proc.new {puts 'yay!'} , Proc.new {puts 'boo!'}) 
mood(:sad, Proc.new {puts 'yay!'} , Proc.new {puts 'boo!'}) 

您可以通過ARGS與例如:

happy.call('very much') 

參數的工作方式與您預期的一樣:

Proc.new {|amount| puts "yay #{amount} !"} 
相關問題