2016-09-19 53 views
0

我有一個接受兩個參數的方法。其中之一是可選的。這些參數實際上是應該發送給對象的方法的名稱。如果在不使用條件的情況下錯過了第二個參數,如何避免獲得NoMethodError?我可以發送一些什麼都不做的「空」方法嗎?在我的情況下,這工作得很好,但它看起來不太好。謝謝。在Rails中發送()可選參數的最佳方式

def foo param_1, parm_2='to_s' 
    object.public_send(param_1).public_send(param_2) 
end 

UPD 發送改爲public_send感謝@Surya

+0

你在哪裏叫這個方法?它是什麼樣子的? –

+0

'foo'是否會返回一個特定的值? – Stefan

+0

你想發送'param_2'到'object'還是'object.send(param_1)'的返回值? – Stefan

回答

1

如果你使用Ruby 2.2.0或更高版本,你可以調用任何對象#itself和獲取的對象。因此,在你的榜樣,你可以做

def foo param_1, param_2 = :itself 
object.send(param_1).send(param_2) 
end 

這將是一樣

def foo param_1, param_2 = nil 
    thing = object.send(param_1) 
    if param_2 
    thing.send(param_2) 
    else 
    thing 
    end 
end 

我也是第二蘇里亞的建議總是使用#public_send來代替。

+0

似乎很好的解決方案到目前爲止 –

+0

我喜歡「自己」的想法。 但是使用'send'似乎是一個糟糕的主意。 –

3

您可以使用send像這樣:

object.send(:my_method, param_1, param_2) 

哪裏my_methodobject定義的方法名。我鼓勵你改用public_send,因爲send可以讓你的代碼調用私有方法,這可能會導致應用程序的意外行爲。

您可以快速檢查是否PARAM_2是否可用:

value = param_2.nil? ? object.send(param_1.to_sym) : object.send(param_1.to_sym).send(param_2.to_sym) 
+0

在我的情況下,param_1和param_2是應該調用的方法名稱對象,而不是:my_method的參數。 感謝public_send。我會用它來代替。 –

+0

查看已更新的答案。 – Surya

相關問題