From: Robert F. <fe...@ce...> - 2003-01-09 07:42:47
|
On Wed, 8 Jan 2003, why the lucky stiff wrote: > > Two things though, when I use Yaml for ini files I'd like to be able to > > spec an order for map pairs to be serialized in. Obviously Ruby hashes has > > no garantuee for this but are there any plans on supporting this? If not > > I'll whip something up myself; I really wanna make sure the most important > > stuff comes out on top... > > Was that two things? > Sorry it was very late. Not sure what the other thing was. I'll get back to you if I remember... ;) > Here's a few solutions to your dilemma: > > 2. The same can't be done for Hashes because the key set isn't > predictable. But if the :SortKeys method is called, then > the Hash will be sorted with Hash#sort. You could define a > singleton `sort' method to sort certain Hashes. > > >> test = { 'name' => 'Alto Saxophone', 'key' => 'Eb', > >> 'is_woodwind' => true } > >> def test.sort > >> order = [ 'name', 'key', 'is_woodwind' ] > >> super { |a,b| order.index( a[0] ) <=> order.index( b[0] ) } > >> end > >> > >> puts test.to_yaml( :SortKeys => true ) > name: Alto Saxophone > key: Eb > is_woodwind: true > > Alternatively, you could define a singleton `to_a' to sort > correctly and skip the :SortKeys option. > That was what I ended up doing: require 'yaml' module SortableToAKeys def key_order=(keys) @__key_order = keys end def to_a ks, out = self.keys, [] (@__key_order + (ks - @__key_order)).each do |key| out << [key, self[key]] if ks.include?(key) end out end end h = {1 => 1, 2=>2} puts h.to_yaml + "\n----" h.extend SortableToAKeys h.key_order = [2, 1] puts h.to_yaml Thanks, Robert |