From: "Toshiyuki Ogura" <oguradio / gmail.com>
Subject: [ruby-list:43494] ブロックとともに呼び出されたsortについて
Date: Tue, 15 May 2007 11:29:40 +0900

るびきちです。

> hash = {"x" => 1, "y" => 0, "z" => 2}
> p hash.sort{|a,b|
>    a[1] <=> b[1]
> }

hashを配列に変換し、第1要素(0から数えて)を基準に並べ変えています。
[key, value]の配列なのでhashの値が基準です。

hash = {"x" => 1, "y" => 0, "z" => 2}
# Hashをsortすると配列化される。
hash.sort{|a,b| a[1] <=> b[1]}  # => [["y", 0], ["x", 1], ["z", 2]]
# 配列化したものは順不同になる。
ary = hash.to_a                 # => [["x", 1], ["y", 0], ["z", 2]]
ary.sort{|a,b| a[1] <=> b[1]}   # => [["y", 0], ["x", 1], ["z", 2]]
# sort_byが使える。
ary.sort_by{|x| x[1] }          # => [["y", 0], ["x", 1], ["z", 2]]
hash.sort_by{|x| x[1] }         # => [["y", 0], ["x", 1], ["z", 2]]

sort_byが有用です。ブロックはそれぞれの要素を取ります。
この場合「第1要素」が基準なので x[1] と『1回だけ』書けばいいのです。

--
rubikitch
http://www.rubyist.net/~rubikitch/