2010-11-21 44 views
30

有人可以向我解釋Ruby在塊中使用管道字符嗎?我知道它包含一個變量名稱,它將在迭代時分配數據。但是這叫做什麼?管道內是否可以有多個變量?還有什麼我應該知道的嗎?任何有關它的更多信息的好鏈接?有人可以解釋Ruby在塊中使用管道字符嗎?

例如:

25.times { | i | puts i } 
+0

相關問題:http://stackoverflow.com/questions/665576/what-are-those-pipe-symbols-for-in-ruby – 2012-03-05 04:05:15

回答

27

括號定義匿名函數,稱爲塊。管道之間的令牌是這個塊的參數。所需參數的數量取決於塊的使用方式。每次評估塊時,需要塊的方法都會傳遞一個基於調用它的對象的值。

與定義方法相同,只是它不會被存儲在接受塊的方法之外。

例如:當被執行時

def my_print(i) 
    puts i 
end 

將這樣做,因爲這:

{|i| puts i} 

唯一的區別是該塊被在飛行定義和不存儲。

例2: 下面的語句是等價的

25.times &method(:my_print) 

25.times {|i| puts i} 

我們使用匿名塊,因爲多數爲塊傳遞函數通常具體到你的情況,不值得定義重用。

那麼當一個方法接受一個塊時會發生什麼?這取決於方法。接受塊的方法將通過以明確定義的方式傳遞其調用對象的值來調用它。返回的內容取決於需要該塊的方法。

例如:在25.times {|i| puts i} .times中爲0和其調用者的值之間的每個值調用一次塊,並將該值作爲臨時變量i傳遞給塊。 Times返回調用對象的值。在這種情況下25.

讓我們看看接受帶有兩個參數的塊的方法。

{:key1 => "value1", :key2 => "value2"}.each {|key,value| 
    puts "This key is: #{key}. Its value is #{value}" 
} 

在這種情況下,每個調用每個鍵/值對傳遞鍵作爲第一個參數和值作爲第二個參數的塊的。

+1

&my_print無效的語法,你的意思&方法(:my_print) – horseyguy 2010-11-22 02:39:07

+0

你是右欄杆。我沒有時間去測試這個例子,我知道&習慣於將變量的值視爲Proc。我只是忘記了方法不包含值。我更新了這個例子。感謝您指出了這一點。 – EmFi 2010-11-22 08:54:50

+4

非常感謝您對我們這些來自Java的奇怪概念的一個很好的解釋。 – Andy 2012-02-18 05:46:17

5

管子指定由調用你的格擋功能填充值的參數。可以有零個或多個,你應該使用多少取決於你調用的方法。

例如,each_with_index使用兩個變量,並將元素放在其中一箇中,並將索引放在另一箇中。

here is a good description of how blocks and iterators work

2

塊參數遵循所有的相同的約定方法參數(至少爲1.9):可以定義可選參數,可變長度ARG列表,默認值等等。這裏的一個pretty decent summary

有些事情要注意:因爲塊看到它們被定義的範圍內的變量,如果你傳入一個與現有變量同名的變量,它會「遮蔽」它 - 你的塊會看到傳入值並且原始變量將保持不變。

i = 10 
25.times { | i | puts i } 
puts i #=> prints '10' 

將在最後打印「10」。因爲即使你沒有傳入一個值(也就是你想確保你不會意外地從一個範圍內變量),你可以在參數列表後面的分號後面指定塊本地變量名:

x = 'foo' 
25.times { | i ; x | puts i; x = 'bar' } 
puts x #=> prints 'foo' 

在這裏,「X」是局部的塊,即使沒有值被傳入。