2010-01-10 77 views
4

我對ruby非常陌生,我試圖用rails框架編寫一個web應用程序。通過閱讀,我看到了這樣的方法:Ruby多個命名參數

some_method "first argument", :other_arg => "value1", :other_arg2 => "value2" 

你可以傳遞無限數量的參數。

你如何在Ruby中創建一個方法,可以以這種方式使用的?

感謝您的幫助。

回答

17

如果您以這種方式調用該方法,則Ruby會採用值爲Hash的方法,因此可行。

這裏是你如何定義一個:

def my_method(value, hash = {}) 
    # value is requred 
    # hash can really contain any number of key/value pairs 
end 

而且你可以這樣調用它:

my_method('nice', {:first => true, :second => false}) 

或者

my_method('nice', :first => true, :second => false) 
1

也許這* ARGS可以幫助您?

def meh(a, *args) 
puts a 
args.each {|x| y x} 
end 

結果這種方法是

irb(main):005:0> meh(1,2,3,4) 
1 
--- 2 
--- 3 
--- 4 
=> [2, 3, 4] 

但我更喜歡在我的腳本this method

0

可以使最後一個參數是一個可選的哈希以實現:

def some_method(x, options = {}) 
    # access options[:other_arg], etc. 
end 

然而,在紅寶石2.0.0,一般最好使用一個新的功能,稱爲keyword arguments

def some_method(x, other_arg: "value1", other_arg2: "value2") 
    # access other_arg, etc. 
end 

使用新的語法,而不是使用哈希的優點是:

  • 這是打字不太訪問可選參數(例如other_arg而不是options[:other_arg])。
  • 指定可選參數的默認值很容易。
  • Ruby會自動檢測調用者是否使用了無效的參數名稱並引發異常。

新語法的一個缺點是你不能(就我所知)將所有關鍵字參數發送給其他方法,因爲你沒有代表它們的哈希對象。

謝天謝地,調用這兩種類型的方法的語法是相同的,所以您可以在不破壞良好的代碼的情況下從一個更改爲另一個。