2015-02-05 20 views
1

PROC實例是在&ruby中的一個函數?

p = Proc.new { |x| puts x*2 } 
[1,2,3].each(&p) 

在「&」告訴紅寶石打開PROC成塊

我有上面的例子中,不知是否&是服用proc用作自變量的函數?

此處還有rails中form_for的簽名。

form_for(record, options = {}, &block) 

是&塊變成proc或其他方式?

回答

2

&是一個一元運算符轉換成PROC塊(或以其它方式),即

def foo 
    yield 
end 

def bar(&block) 
    block.call 
end 

baz = -> { print "baz" } 

foo(baz) # => ArgumentError: wrong number of arguments (1 for 0) 
foo(&baz) # => baz 

foo(baz) # => ArgumentError: wrong number of arguments (1 for 0) 
foo(&baz) # => baz 
+0

- > {print「baz」} ' - >'是做什麼的? – MWL

+1

它出現在1.9 – Hauleth

+0

的lambda語法中謝謝!還有一個問題。因爲任何紅寶石都是一個對象。是&對象?它的類型是什麼? – MWL

3

我有上面的例子中,不知是否&是服用proc用作自變量的函數?

這不是一個函數(Ruby沒有函數)。這是一個運營商。它只在一個參數列表中有效,並且它將一個Proc對象「展開」爲一個塊,就像它已經作爲一個文字塊傳遞一樣。如果對象不是Proc,它會嘗試通過發送消息to_proc將其轉換爲一個。

是&塊變成proc或其他方式?

在這種情況下,&是一個印記,這只是在一個參數列表有效(類似於*如何表示其餘參數)。它將傳遞給消息發送的文本塊「包裝」到一個Proc對象中,並將其綁定到該參數,以使其在方法/塊體內按名稱可用。通常情況下,塊是匿名的,只能隱含地編輯yield

+0

所以它意味着'&'可以將參數列表中給出的文字塊轉換爲proc,反之亦然? – MWL

相關問題