我有一個代碼,看起來像這樣:調用一個泛型函數帶或不帶參數
def my_function(obj)
if obj.type == 'a'
return [:something]
elsif obj.type == 'b'
return []
elsif obj.type == 'c'
return [obj]
elsif obj.type == 'd'
return [obj]*2
end
end
我想所有這些if...elsif
塊分成功能是這樣的:
def my_function_with_a
return [:something]
end
def my_function_with_b
return []
end
def my_function_with_c(a_parameter)
return [a_parameter]
end
def my_function_with_d(a_parameter)
return [a_parameter] * 2
end
我調用這些函數與
def my_function(obj)
send(:"my_function_with_#{obj.type}", obj)
end
的問題是,有些功能需要的參數,有的則沒有。我可以很容易地定義def my_function_with_a(nothing=nil)
,但我相信有更好的解決方案來做到這一點。
@Dogbert對arity
有個好主意。我有這樣一個解決方案:
def my_function(obj)
my_method = self.method("my_function_with_#{obj.type}")
return (method.arity.zero? ? method.call : method.call(obj))
end
你打算如何使用這段代碼?你可以得到函數的'arity',並根據它傳遞參數,但是這個方法取決於你想如何使用它。 – Dogbert
這可能是一個X/Y問題,因爲你認爲你需要做X來實現Y,但是你最終得到的設計有一些病態 - 這可能是值得分享你的更廣泛的設計並詢問是否有任何好的直接實現Y的模式 –
這個對象是什麼?你從哪裏得到它? –