青山です。 On Thu, 14 Oct 1999 17:18:28 +0900, WATANABE Hirofumi <Hirofumi.Watanabe / jp.sony.com> wrote: > そもそも初めて > a.to_i <=> b.to_i || a.to_i <=> b.to_s > を見てすぐに意味がわかるかなあ? あ、まったく違和感を感じていなかったのですが、他の人のコメントをみると、 そうか、これは Perl におかされていたようですね。なるほど。まずここから 離れないとだめだったのか。 > :[a.to_i, a.to_s, a.to_f] <=> [b.to_i, b.to_s, b.to_f] 略 > だから Ruby の場合はこうなんだでいいと思います. > Perl よりよっぽどわかりやすいし. > > 問題は全部評価してから比較すること. って結構痛いかも. 略 > で Schwartzian Transform の話に続くわけで. (テストスクリプトの書き方を勘違いしていなければ)速度面も [] <=> [] の 方が速いようですし、Ruby の場合はこうなんだで良さそうみたいですね。 $ ruby -e ' s = (1..20000).collect{|i|i} + ("a".."zzz").collect{|i|i} foo = [] 1.upto(20000) do foo.push s[rand(38277)] end GC.start t = Time.now foo.sort!{|a,b| (a.to_i <=> b.to_i).nonzero? || a.to_s <=> b.to_s } t1 = Time.now GC.start t2 = Time.now foo.sort!{|a,b| [a.to_i, a.to_s] <=> [b.to_i, b.to_s] } t3 = Time.now GC.start t4 = Time.now foo.filter{|i| [i.to_i, i.to_s, i] }.sort!.filter{|i| i.pop } p [t1 - t, t3 - t2, Time.now - t4] ' [9.837501, 1.182695, 1.564295] -- 青山 和光 Wakou Aoyama <wakou / fsinet.or.jp