[#47529] ruby1.9.2 にて、 IO#reopen で第2引数を省略したときにモードが引き継がれない — jugyo kohno <kkohno@...>

jugyo と申します

11 messages 2010/10/08
[#47562] Re: ruby1.9.2 にて、 IO#reopen で第2引数を省略したときにモードが引き継がれない — "Y. NOBUOKA" <nobuoka@...> 2010/10/15

信岡です。

[#47537] Excel用のxmlssファイルを作成するライブラリ exlap_c — "YOSHIIZUMI" <t-yoshiizumi@...>

 吉泉といいます。

11 messages 2010/10/10

[ruby-list:47544] Re: ruby 1.9.2でArrayのsortの結果が期待通りにならない

From: Nobuhiro IMAI <nov@...>
Date: 2010-10-11 17:42:42 UTC
List: ruby-list #47544
いまいです。

From: sesame <sesame_at_purple.halfmoon.jp>
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 <nov@yo.rim.or.jp>
Key fingerprint = E57F 2482 4074 13BC 3B9A  165B C689 5B16 A620 4657

In This Thread