2016-11-20 21 views
1
def makeProc(&obj) 
    obj 
end 

puts makeProc{|x,y| x+y}.class 

當一個塊作爲參考傳遞給它時,obj如何成爲一個Proc類型?有沒有任何理由,或者它就像某種紅寶石魔法?這是如何創建一個proc對象?

回答

1

參數列表中的&符號和一元前綴sigil表示所謂的「塊參數」。它基本上意味着像「將塊參數包裝在適當的Proc對象中並將其綁定到此參數名稱」。

請記住:塊應該是語法和語義輕量級的,它們實現這一點的一種方式是,它們不是對象,也不能被命名。這樣做的結果是,你只能做三件事情塊:

  1. 忽略它們
  2. yield他們
  3. 檢查,如果一個塊傳遞(使用block_given?

這就是它。如果你想做任何事情之外,你需要a)一個對象和b)一個名字,這是和號和一元前綴sigil所做的。

參數列表時,&&符元前綴操作者確實逆:它解開一個Proc對象成塊(或,如果對象不是Proc已經時,它發送它的to_proc消息以將其轉換成Proc)。

+0

是的我只是做了一個硬性檢查,你當然是正確的,'Proc.new'永遠不會被調用。我應該在發佈之前完成此操作。我從中收集了這個理論的教科書(一個着名的教科書),在這個過程中清楚地暗示了'Proc.new'被調用,所以我犯了一個真正的錯誤。 –