From: Fujisaki <fujisaki / elf.coara.or.jp>
Subject: [ruby-list:39720] 最後
Date: Thu, 3 Jun 2004 00:06:28 +0900

るびきちです。

> # puts File.read(Filename).split(/\n/).collect{|list| list.split(' ')}
>                          #.split(/\n/) 抜き で 作動しました。
>   puts File.read(Filename).collect{|list| list.split(' ')}

この例ではsplit(/\n/)がなくても動く理由を補足しておきます。
つまりStringにEnumerable#collectメソッドが使えます。なぜか?

ちなみに「クラス・モジュール名#メソッド名」はクラス・モジュールに属す
るメソッドを表す一般的な表記方法です。クラスメソッドは「クラス・モジュー
ル名.メソッド名」と表記します。ここに出てきているものではFile.readがク
ラスメソッドです。クラスメソッドはruby的にはクラスの特異メソッドです。

StringはEnumerableモジュールをincludeしています。だからStringでも
collectが使えるのです。collectをはじめとするEnumerableモジュールのメソッ
ドが使えるための条件、それはそのクラスにeachメソッドが定義されているこ
とです。String#eachは「文字列中の各行に対して繰り返し」を行うメソッド
です。String#collectは文字列中の各行をブロック引数とし、ブロックの最後
に評価された式を「集めて(collect)」配列にします。
collectについてわかりにくければ、collectの前にto_aを置いて考えてみるといいです。
to_aもEnumerableで定義されたメソッドで、繰り返す対象を配列にしたものです。
puts File.read(Filename).to_a.collect{|list| list.split(' ')}
は
puts File.read(Filename).collect{|list| list.split(' ')}
と等価です。

ただし、split(/\n/)がある場合とない場合では微妙に異なります!
文字列をsplit(/\n/)した結果は((*改行をなくした*))各行の配列です。
そのため、
puts File.read(Filename).split(/\n/).collect{|list| list.split(' ')}
のlistには改行のない文字列が入ってきます。対して、文字列に直接collect
を適用した場合、改行つきの文字列が入ってきます。ただ運がよくlistに改行
が含まれていようがいまいがsplit(' ')の結果が同じになっただけです。
ここははまりやすい点なので気をつけてください。実際俺もよくはまりました。

改行を取り除きたい場合は、String#chompを使います。破壊的バージョンとし
てString#chomp!  があります。String#eachやcollectを使って改行が邪魔だ
と思ったらおもむろにchomp!してしまいましょう。

splitの引数を省略するとsplit(' ')と同じです。
空白でsplitしたいときは引数を省略してかまいません。

また、Rubyの式をいろいろ評価して実験したければ、irbを使うといいです。
Rubyをインストールしたときに一緒にインストールされますので。
irbを実行したらプロンプトが現れるのでRubyの式を入力します。
すると式が評価されて結果が表示されます。
Emacsをお使いならば、Rubyに標準添付されているinf-ruby.elをロードして、
M-x run-rubyを実行するとEmacs上でirbが使えます。
それをさらに拡張したのが拙作irbshです。


irbsh[03@07:00](main):066:0> "a\nb\nc".split
["a", "b", "c"]


http://www.rubyist.net/~rubikitch/computer/irbsh/
http://www.rubyist.net/~rubikitch/archive/irbsh-0.9.3.tar.gz

# ただいまRAAが使えないのでURLを残しておきます。

るびきち☆
http://www.rubyist.net/~rubikitch/ ←Ruby大衆化計画@移転