2013-05-15 68 views
-1

我有一個代碼,看起來像這樣:調用一個泛型函數帶或不帶參數

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 
+1

你打算如何使用這段代碼?你可以得到函數的'arity',並根據它傳遞參數,但是這個方法取決於你想如何使用它。 – Dogbert

+0

這可能是一個X/Y問題,因爲你認爲你需要做X來實現Y,但是你最終得到的設計有一些病態 - 這可能是值得分享你的更廣泛的設計並詢問是否有任何好的直接實現Y的模式 –

+0

這個對象是什麼?你從哪裏得到它? –

回答

1
def my_function(obj) 
    method = method("my_function_with_#{obj.type}") 
    method.call(*[obj].first(method.arity)) 
end 
+0

不錯,我喜歡這樣:)美麗的紅寶石! – pierallard

1

的功能更改爲類似:

def my_function_with_foo(bar=nil) 
    if bar 
    return ['foo', bar] 
    else 
    return ['foo'] 
    end 
end 

現在下面將兩者的工作:

send(:"my_function_with_#{foo_bar}") 
=> ['foo'] 
send(:"my_function_with_#{foo_bar}", "bar") 
=> ['foo', 'bar'] 

你也可以把它寫這樣如果你不想使用if/else,你確定你永遠不需要nil在陣列中:

def my_function_with_foo(bar=nil) 
    return ['foo', bar].compact 
end 
+0

我不清楚我的問題。我編輯它! – pierallard

+0

如何將所有這些方法放在對象的類中,並使用'obj.send(:my_function_with _#{obj.type}「)''。一旦進入課堂,你可以做'return [self] * 2','return [self.attr1,self.attr2]'等 –

0

您可以使用默認值

def fun(a_param = nil) 
    if a_param 
     return ['raboof',a_param] 
    else 
     return ['raboof'] 
    end 
end 

或...

def fun(a_param : nil) 
    if a_param 
     return ['raboof',a_param] 
    else 
     return ['raboof'] 
    end 
end 

如果你有多個參數,因爲現在當你調用它,你可以只通過在後者是有用的那些現在很重要的東西。

fun(a_param:"Hooray") 
+0

我只是問我的問題,因爲我以前的函數看起來像你的解決方案,但與15'如果','elsif','elsif' ... – pierallard

+0

啊你有很多很多參數?你可能想要做一些像湯姆L推薦的東西。 – VoronoiPotato

+0

不,我有1個參數或0.所有功能的統一參數都是相同的。 – pierallard

2
def foo(*args) 
    [ 'foo' ].push(*args) 
end 

>> foo 
=> [ 'foo' ] 
>> foo('bar') 
=> [ 'foo', 'bar' ] 
>> foo('bar', 'baz') 
=> [ 'foo', 'bar', 'baz' ] 
+0

不錯,那是我的下一個:) –

+0

我的問題並不清楚。我編輯它! – pierallard

1

檢查如何調用方法在Ruby中,爲我會建議你這兩種資源:wikibooksenter link description here

就以可選參數的特殊說明,在這裏你可以定義這樣的方法:

def method(*args) 
end 

然後調用這樣稱呼它:

方法

方法(ARG1 )

方法(arg1,arg2)