From: Nobuhiro IMAI Date: 2010-10-12T02:42:42+09:00 Subject: [ruby-list:47544] Re: ruby 1.9.2でArrayのsortの結果が期待通りにならない いまいです。 From: sesame Date: Tue, 12 Oct 2010 02:10:17 +0900 > しかし、pメソッドを実行するタイミングによって、 > [[2, 8], [6, 7], [9, 3]] > という結果が返ってきます。 > > このような結果になる理由がわからないのですが、 > ご教示いただけないでしょうか。 代入やメソッド呼び出しと、ブロック(特にdo~end)の結合強度の関係ですね。 ブロックを{}に変えて書きますが、それぞれ、 > *ソース > puts "#-------------------------------------" > p [[9,3],[2,8],[6,7]].sort do |i,j| > i[1] <=> j[1] > end p([[9,3],[2,8],[6,7]].sort){...} > puts "#-------------------------------------" > p a = [[9,3],[2,8],[6,7]].sort do |i,j| > i[1] <=> j[1] > end > p a p(a = [[9,3],[2,8],[6,7]].sort){...} > puts "#-------------------------------------" > a = [[9,3],[2,8],[6,7]].sort do |i,j| > i[1] <=> j[1] > end > p a a = [[9,3],[2,8],[6,7]].sort{...} p a と解釈されていて、上の二つではブロックなしの Array#sort の結果が p に渡 され、ブロックは無視されています。Array#sort は要素が配列だとその最初の 要素から比較するので、[[2, 8], [6, 7], [9, 3]] となっています。 ちなみに、この様な場合は sort_by を使うのがよいと思います。 >> [[9,3],[2,8],[6,7]].sort_by{|a| a[1]} => [[9, 3], [6, 7], [2, 8]] -- Nobuhiro IMAI Key fingerprint = E57F 2482 4074 13BC 3B9A 165B C689 5B16 A620 4657