2016-08-17 51 views
1

我有以下方法:紅寶石調用可選參數

def method(a=1, b=2, c=3, d=4) 
    puts a 
    puts b 
    puts c 
    puts d 
end 

有沒有辦法像這樣的輸出,而不檢查變量無效?當我打電話等方法:

method(5,7) 
=> 5 
=> 2 
=> 7 
=> 4 
+1

是應該怎麼知道你省略b和d,而不是c和d,說什麼? –

+0

你有沒有考慮使用關鍵字參數:https://robots.thoughtbot.com/ruby-2-keyword-arguments (否則,沒有辦法) –

回答

1

的參數取入順序,以便當有此方法:

def method(a=1, b=2, c=3, d=4) 
    puts a 
    puts b 
    puts c 
    puts d 
end 

呼叫:

method(5,7) 

指:a = 5, b = 7,c = 3(默認值),d = 4(默認值)

沒有指定參數的方法,其他人。

如果你希望能夠指定參數,另一種是使用哈希爲所有PARAMS:

def method(options) 
    a = options[:a] || 1 
    b = options[:b] || 2 
    c = options[:c] || 3 
    d = options[:d] || 4 
end 

然後,您可以撥打電話如:

method(d: 5, c: 7) 

=> 1 
=> 2 
=> 7 
=> 5 
+0

你的第二個建議已被關鍵字參數所棄用。 –

+0

你是對的 - 同樣的原則,但更現代的做法 – Martin

0

一流行的選擇是用所謂的「命名參數」重新定義你的方法。那麼,它們並不是真正的命名參數,它們只是一些帶有一些語法糖的散列參數。

def method(args) 
    args = {a: 1, b: 2, c: 3, d: 4}.merge(args) 
    args.each { |key, val| puts val } 
end 

method(c: 30, a: 10) 

> 10 
> 2 
> 30 
> 4 
+0

這裏使用關鍵字參數的好處是什麼?你的代碼似乎對我來說同樣也更復雜。 –

+0

首先,它適用於Ruby 1.9。二,它仍然是流行的開源庫中常用的模式,用於兼容性,而OP將有助於學習這種語法。 – Uzbekjon

+0

好吧,我認爲如果你提到這個問題,它會改善你的答案。 –

1

正如Taryn East在他的評論中提到的,自從Ruby 2.0以來,您可以使用關鍵字參數來實現您想要做的事情。你只需要定義你的方法不同的一點:

def method(a:1, b:2, c:3, d:4) 
    puts a 
    puts b 
    puts c 
    puts d 
end 

然後,你可以把它指定要通過名稱來設置參數,使別人的默認值:

method(a:5, c:7) 
=> 5 
=> 2 
=> 7 
=> 4 

作爲另一個好處,它提高了可讀性,並且不會讓讀者猜測傳遞值的含義。