2011-02-03 84 views
3

在使用Rails的時候,我發現可以像這樣調用方法。編寫一個在Ruby中不同行參數的方法

lot = Lot.new do |u| 
    u.grade_id = grade.id 
    u.company_id = company.id 
    u.type_id = type.id 
    u.sale_id = sale.id 
    u.quantity = lot[6] 
    u.price = lot[3] 
    u.info = lot[4] 
    u.remark = lot[5] 
end 

正如你所看到的,我在不同的行上傳遞了參數。

我需要編寫一些需要大量參數的方法,並且認爲如果我可以像這樣調用我的方法會更好。有人能告訴我如何做類似的方式接受參數的寫法嗎?鏈接到一些指南/文檔將是很大的幫助。這是他們在Ruby中調用代碼塊的方式嗎?

+0

不確定你在問什麼。 * *這是我所擁有的,這是我需要的*代碼片段將有所幫助。 – Zabba 2011-02-03 11:07:08

+0

嗨Zabba。我在RoR中找到了一個`new`方法,正如你可以從代碼片段中看到的那樣,我將這些參數分別傳遞給它們。通常人們會通過'methodname(param1,param2,param3等)`調用一個方法。 – 2011-02-03 11:19:41

回答

3

上面的示例沒有傳遞任何參數。您只需調用一個方法並使用塊在新創建的實例上生成。

此代碼

lot = Lot.new do |u| 
    u.grade_id = grade.id 
    u.company_id = company.id 
end 

可以寫成

lot = Lot.new 
lot.grade_id = grade.id 
lot.company_id = company.id 

第二示例沒有使用的塊。

如果您希望您的對象在初始化時接受塊,請在initialize文件中添加以下代碼行。

yield self if block_given? 

下面是一個例子

class MyObject 
    def initialize 
    # ... 
    yield self if block_given? 
    end 
end 
0

您需要在您的方法中傳遞一個塊。

def initialize(&block) 
    yield self 
end 
+1

請注意,在這裏捕捉塊作爲參數是不需要的,並且(非常輕微)性能受到影響。 – Phrogz 2011-02-03 14:24:05

0

潛水更深,我想你會在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的答案,並且可以幫助您在將來的編程中使用塊。