Ruby 1.9では、がソートされていますが、Hash#sort
はまだArray
のArray
を返します。想像してみろ!それはあなたがそれの上に独自のソート方法を構築できることを意味します。
Hash
Ruby 1.8ではソートされていません。 Ruby 1.8との互換性が必要な場合は、ActiveSupportのOrderedHash
を使用できます。あなたはそれに同じsorted_hash
メソッドを定義することができますので、それは、1.9- Hash
ように振る舞う:
class ActiveSupport::OrderedHash
def sorted_hash(&block)
self.class[sort(&block)]
end
end
hash = ActiveSupport::OrderedHash.new
hash["b"] = "b"
hash["a"] = "a"
hash #=> {"b"=>"b", "a"=>"a"} => unsorted
hash.sorted_hash #=> {"a"=>"a", "b"=>"b"} => sorted!
それはデフォルトでは存在しないので、あなたは、あなたのコードにsorted_hash
方法をコピーする必要があります!
深いソートの更新: あなたはハッシュキー以外のものに並べ替えるために探している場合は、次のようにsorted_hash
メソッドにブロックを渡す(上から実装を想定):
hash = ActiveSupport::OrderedHash.new
hash["a"] = { "attr" => "2", "..." => "..." }
hash["b"] = { "attr" => "1", "..." => "..." }
# Unsorted.
hash
#=> {"a"=>{"attr"=>"2", "..."=>"..."}, "b"=>{"attr"=>"1", "..."=>"..."}}
# Sort on the "attr" key. (Assuming every value is a Hash itself!)
hash.sorted_hash { |a, b| a[1]["attr"] <=> b[1]["attr"] }
#=> {"b"=>{"attr"=>"1", "..."=>"..."}, "a"=>{"attr"=>"2", "..."=>"..."}}
私はあなたを得ませんでした。私はレール2.3.2のOrderedHashソースコードを調べました。ソート方法に関しては何も表示されません。 – Dharam
@satynos:私は少しうまくいけばそれを明確にした。自分でsorted_hashを定義する必要がありますが、本当に簡単です!必要に応じて実装をコピーしてください。 – molf
@molf:excellent ...フィードバックと実装のお手伝いをいただきありがとうございます。また、私はハッシュクラスであなたのメソッドを実装する場合、それは動作しますか? ActiveSupport :: OrderedHashで実装する必要がありますか? – Dharam