2013-05-15 129 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)