Consider the code:
class A
attr_accessor :b, :c, :d, :e, :h, :i, :x
end
Now imagine that you want to initialize each instance variable to the one that has the same name in the hash.. Imagine all the repetitive and crappy code that would generate.
But this is Ruby and with Ruby there is *nearly* always a better way. Instead, meta-program it, and mix-it-in.
module constructed_from_hash
def initialize(h)
h.each { |k, v| send("#{k}=", v) }
end
end
class A
include constructed_from_hash
attr_accessor :b, :c, :d, :e, :h, :i, :x
end
Nice, elegant and clean. Just the way Ruby code is supposed to be. AND this code will now scale, as more accessors are added to the object over time, the constructor too, wont need reprogramming. If you don’t need to do this often, you can pull just the constructor out of the module and put it directly into the class, but this way provides the most flexibility.
Header image taken from Examining Dwemthy’s Array composite pattern. An interesting read in it’s own right. check it out.