僕は学生時代,スパゲティばかりを茹でていた時期があった。一人暮らしをしていた多くの友人もそうだったから,学生時代のある時期はスパゲティを茹でるという,悲しいまでも文化的な行為のために存在しているのかもしれない。

 スパゲティを茹でるという行為と,Rubyでコードを書くという行為は似ている。どちらも“何か”を目的とした行為であるが,それ自体に意味を持ち得る行為でもある。いずれにせよ僕は,オランダの風車のように今日もスパゲティを茹で,Rubyでコードを書いている。

 今回は,「ファイルの扱い方」とRubyの大きな特徴である「イテレータ」について語ろうと思う。そしてイテレータの知識を携えて「複数ラブレター編集ツール」を作ろう。前回もそうだったが,このツールもまた,僕の大学時代からの友人Kに頼まれたツールだ。彼もまた,いまだにスパゲティを茹で続けている。

Rubyのイテレータについて

図1●0~9までの数値を表示した画面
図1●0~9までの数値を表示した画面

 さて,イテレータとは何だろうか。イテレータとは,ループ処理,つまりグルグル回る繰り返し処理のための機能だ。こう言い切ってしまうと簡単そうだが,実はイテレータを正確に言葉で表現するのは少し難しい。具体例を見てもらった方がわかりやすいだろう。

 例えばリスト1のように,0~9までを表示するプログラムを書いてみる。先月と同様,Cドライブ以下に作成したworkフォルダ内で,リスト1をcount.rbというファイルに保存して,コマンドプロンプトから「ruby count.rb」を実行する*1。するとコマンドプロンプトに,図1のように0~9までの数値が表示されるはずだ。

10.times do |i|
  puts i
end
リスト1●0~9までを表示するプログラム(count.rb)

 timesメソッドは,指定回数だけ繰り返すメソッドだ。繰り返し回数とtimesを「.(ピリオド)」でつなぎ,「|(パイプ)」に変数iを定義している。変数iが参照されて0~9までの数値を表示している。

 do~endまで囲まれた部分を10回繰り返し,その回数の数字が |i|と書かれた変数iに代入される。ただし,0から数えるため,リスト1は0~9までを表示するようになる。

 リスト1のコードを日本語に読み変えると「10回(times)do~endを繰り返してくれ」と読める。なんて素直なコードだろう。

 このように「繰り返し」の実行処理を,Rubyではイテレータと呼んでいる。先ほど出てきたdo~endで囲まれた部分を一般的にブロックと呼ぶが,このブロックを繰り返すための機能がイテレータだ。

 イテレータはRubyでよく使われる機能で,リスト1のように回数分ブロックの処理を繰り返す以外に,とりわけ配列で非常によく使用される。