I was working on a small Ruby program today and I repeatedy needed to write classes that can accept a variable number of arguments in their constructors.
This is the initial solution I came up with:
class MyClass
def initialize(*args)
init_methd_name = "_init_#{args.size}"
send(init_methd_name, *args)
end
protected
def _init_0
puts "_init_0"
end
def _init_1(arg1)
puts "_init_1: " + arg1
end
def _init_2(arg1, arg2)
puts "_init_2: " + arg1 + " " + arg2
end
end
MyClass.new
# => "_init_0"
MyClass.new("Arg 1")
# => "_init_1: Arg1"
MyClass.new("Arg 1", "Arg 2")
# => "_init_2: Arg 1, Arg 2"
In order to avoid defining #initialize
like this over and over again, the #initialize
method can be moved into its own module:
module SmartInit
def initialize(*args)
init_methd_name = "_init_#{args.size}"
send(init_methd_name, *args)
end
end
SmartInit
can then be used similar to this:
class MyClass
include SmartInit
protected
def _init_0
puts "_init_0"
end
def _init_1(arg1)
puts "_init_1: " + arg1
end
def _init_2(arg1, arg2)
puts "_init_2: " + arg1 + " " + arg2
end
end
Here's a variation on the same idea that would require less typing:
https://gist.github.com/Michael-Gannon/4734608
(should probably have linked these way back in the day)