Возможно, вам придется свернуть это самостоятельно, если у кого-то еще нет лучшего предложения.
class SortedHash
def initialize
@data = []
end
def [](k)
@data.find {|kp,vp| kp == k}.last
end
def []=(k, v)
@data.reject! {|kp,vp| kp == k}
@data << [k, v]
@data = @data.sort_by {|kp,vp| kp}
end
def each(&b)
@data.each(&b)
end
end
sh = SortedHash.new
sh[32] = "no"
sh[1] = "later"
sh[99] = "after"
sh.each do |k,v|
p [k,v]
end
Выход:
[1, "later"]
[32, "no"]
[99, "after"]
Массив сортируется по ключам, поэтому они могут быть любого вызова, и вам просто нужно определить операторы сравнения для них.