naruse です。 Toshiyuki Ogura さんは書きました: > ブロックの中で > a[1] <=> b[1] > としているので、何かと何かの2つのものを比較しているように見えます。 > このようなとき、sortのレシーバが、キーと値のペアが3組以上あるハッシュ > や、要素が3個以上ある配列の場合はこの式はどうなるのでしょうか。 3個のうちの、どれか一つがaに、また別のどれかがbに入ります。 例えば、 [1,2,3,4,5].sort{|a,b| p([a,b]); a<=>b} としてみると、手元では [1, 3] [3, 5] [2, 3] [4, 3] [4, 5] [1, 2] と出力されました。 このように、2つの要素を何度か比較して、最終的にsortを行っています。 なぜこれで sort ができるのかは、Wikipediaあたりで調べてください。 Rubyではクイックソートが用いられているそうです。 http://ja.wikipedia.org/wiki/%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%BD%E3%83%BC%E3%83%88 参考までに array.c のソースも、qsort ってのが見えますね。 static VALUE sort_internal(ary) VALUE ary; { struct ary_sort_data data; data.ary = ary; data.ptr = RARRAY(ary)->ptr; data.len = RARRAY(ary)->len; qsort(RARRAY(ary)->ptr, RARRAY(ary)->len, sizeof(VALUE), rb_block_given_p()?sort_1:sort_2, &data); return ary; } src/ruby/branches/ruby_1_8/array.c: unmodified: line 1619 of 3065 [52%] > sortのブロックの中で使われる > a[1] <=> b[1] > は、どう理解すれば分かりやすいのでしょうか。 > この場合、難しく考えないで、理屈抜きで、ソートするときは > a[1] <=> b[1] > のように書く、と覚えていても差し支えないでしょうか。 {"x" => 1, "y" => 0, "z" => 2}.sort{|a,b| a[1] <=> b[1]} は [["x", 1], ["y", 0], ["z", 2]].sort{|a,b| a[1] <=> b[1]} と書き換えられるわけですが、ここでのa[1], b[1]は、 sortしているarrayの要素 (例えば["x", 1]) の、 2個目の要素 (例えば1) 同士を比較しているわけで、 これはすなわち、元の hash それぞれの key => value の組の、 value 同士を比較している、という意味です。 理屈抜きで覚えると複雑なソートをしたくなった時に困るかと。 -- NARUSE, Yui <naruse / airemix.com> DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA