潛水更深,我想你會在Ruby的「塊」(這是不同於一般的編程術語「代碼塊」不同的更深層次的理解中受益或「代碼塊」)。
假裝下列(無效)Ruby代碼實際工作了一會兒:
def add10(n)
puts "#{n} + 10 = #{n+10}"
end
def do_something_with_digits(method)
1.upto(9) do |i|
method(i)
end
end
do_something_with_digits(add10)
#=> "1 + 10 = 11"
#=> "2 + 10 = 12"
...
#=> "9 + 10 = 19"
雖然該代碼是無效的,其意圖傳遞一些代碼的方法和具有方法運行的代碼,是Ruby可以通過各種方式實現。其中一種方式是「塊」。
Ruby中的塊非常非常像一個方法:它可以接受一些參數併爲這些參數運行代碼。無論何時您看到foo{ |x,y,z| ... }
或foo do |x,y,z| ... end
,這些塊都需要三個參數並在其上運行...
。 (你甚至可能看到upto
上述方法被傳遞塊。)
因爲塊是的Ruby語法的一個特殊部分,每一個方法允許傳遞一個塊。方法使用該塊取決於方法。例如:
def say_hi(name)
puts "Hi, #{name}!"
end
say_hi("Mom") do
puts "YOU SUCK!"
end
#=> Hi, Mom!
的方法,上述傳遞塊是準備發出損傷,但由於該方法從未調用塊,當打印僅好的消息。下面是我們如何調用該塊從一個方法:
def say_hi(name)
puts "Hi, #{name}!"
if block_given?
yield(name)
end
end
say_hi("Mridang") do |str|
puts "Your name has #{str.length} letters."
end
#=> Hi, Mridang!
#=> Your name has 7 letters.
我們使用block_given?
看到一塊是否沿着或者不通過。在這種情況下,我們將一個參數傳回給塊;這取決於你的方法來決定要傳遞給塊的內容。例如:
def say_hi(name)
puts "Hi, #{name}!"
yield(name, name.reverse) if block_given?
end
say_hi("Mridang"){ |str1, str2| puts "Is your name #{str1} or #{str2}?" }
#=> Hi, Mridang!
#=> Is your name Mridang or gnadirM?
這只是(你想支持和良好的一個,和一個)對於某些類通過剛剛創建的塊實例的約定。
希望這可以幫助您更好地理解@ SimoneCarletti的答案,並且可以幫助您在將來的編程中使用塊。
不確定你在問什麼。 * *這是我所擁有的,這是我需要的*代碼片段將有所幫助。 – Zabba 2011-02-03 11:07:08
嗨Zabba。我在RoR中找到了一個`new`方法,正如你可以從代碼片段中看到的那樣,我將這些參數分別傳遞給它們。通常人們會通過'methodname(param1,param2,param3等)`調用一個方法。 – 2011-02-03 11:19:41