我有一个看起来像这样的代码:
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