次のようなコードがありました。
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