OpenStruct is a nice tool to work with. However…
Let’s say you do this:
user = OpenStruct.new( :name => "Franca Botanica", :uid => "777" )
address = OpenStruct.new( :user => user, :country => "Paraguay" )
some_stuff = []
some_stuff << user
some_stuff << address
and now you want to iterate over the some_stuff
collection and want to dump all those “containers” you created. But how do you find out which fields those OpenStruct
instances have?
You could consult the documentation and be tempted to inspect
them:
some_stuff.each { |c| c.inspect }
Let’s try it:
p address.inspect
"#<OpenStruct country=\"Paraguay\", user=#<OpenStruct ...>>"
Not terribly useful, is it? Instead of parsing that stuff, we can do some white box engineering and do:
class OpenStruct
def fields
@table.keys
end
end
Now we can instead do:
p address.fields
… and be sure, that our code will break once OpenStruct
will be re-engineerd. Let’s see what ruby’s gatekeepers think of this