Struct for throwaway objects, OpenStruct only when keys may change, or you have a hash and must have accessor methods.
# Fastest, needs to initialize a Struct first
T = Struct.new(:name)
t1 = T.new('test')
t1.name # => 'test'
t1.foo # => error!
# Fast, needs to use hash lookups
t3 = {name: 'test'}
t3[:name] # => 'test'
t3[:foo] # => nil
# Slow, convenient
t2 = OpenStruct.new(name: 'test')
t2.name # => 'test'
t2.foo # => nil