[ruby-list:45894] Re: "abc".sort returns ["abc"] with Ruby1.8.7

From: Nobuhiro IMAI <nov@...>
Date: 2009-02-28 03:44:41 UTC
List: ruby-list #45894
いまいです。

From: "Hideo Konami" <konami_at_kyoto-wu.ac.jp>
Date: Fri, 27 Feb 2009 10:15:43 +0900

> それよりなぜこういうことになるのか,それを知りたいので
> すが,答えてやろうという方がおられたらうれしいです。

String#sort で配列が返るのはなぜ?ということでしょうか。

>> ruby version
> ruby 1.8.7 (2008-08-11 patchlevel 72) [i686-darwin9.5.0]
> 
> irb(main):001:0> "abc".sort
> => ["abc"]

1.8 では String(Enumerable)#sort が String#each を呼んで、行ごとにイテ
レートするので、self.each_line.to_a.sort のような処理をしているからだ
と思います。

るりまより:
>> String#each
>> --- each(rs = $/) {|line| ... }      -> ()
>> --- each_line(rs = $/) {|line| ... } -> ()
>> --- each(rs = $/)       -> Enumerable::Enumerator
>> --- each_line(rs = $/)  -> Enumerable::Enumerator
>> 
>> 文字列中の各行に対して繰り返します。

each_line というか、ここでは lines の方が合ってる気がしますが、同じこ
とですね。

>> "".sort
=> []
>> "".each_line.to_a.sort
=> []
>> "b\n\a\n".sort
=> ["\a\n", "b\n"]
>> "b\n\a\n".each_line.to_a.sort
=> ["\a\n", "b\n"]

to_a はなくてもいいんですが、それはそれとして。

>> /usr/bin/ruby --version
> ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-darwin9.6.0]
> 
> irb(main):001:0> "abc".sort
> NoMethodError: undefined method `sort' for "abc":String

こちらは okkez さんのおっしゃるように、String#sort がなくなったからで
すね。
--
Nobuhiro IMAI <nov@yo.rim.or.jp>
Key fingerprint = F39E D552 545D 7C64 D690  F644 5A15 746C BD8E 7106

In This Thread

Prev Next