我有一个代码,看起来像这样:调用一个泛型函数带或不带参数
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的模式 –
这个对象是什么?你从哪里得到它? –