PR

 ちょっと脱線してしまいました。さて,配列とくればループ(繰り返し)と組み合わせて処理をするケースが数多くあるでしょう。Rubyは一般的なプログラミング言語と同様に,for文を使うこともできますが,Rubyistはイテレータを使うのを好みます。イテレータは,ループ処理を抽象化して簡単に書くための仕組みです。例を見てみましょう(リスト3)。(6)の行でArrayオブジェクトlunchに,三つの要素を代入しています。(7)の部分がイテレータです。Arrayオブジェクトの全要素に対して,「{」と「}」の間が繰り返されます。繰り返す部分を「ブロック」と呼びます。実行結果は図2です。eachメソッドが,ブロックに,一つずつ要素を手渡すイメージですね。

リスト3●イテレータを利用したループの例
リスト3●イテレータを利用したループの例
図2●リスト3の実行結果
図2●リスト3の実行結果

もし,C言語のfor文で書くと,以下のようになります。

  for (i = 0; i < 3 ; i++){ …

 面倒なのは条件式を書く部分です。一瞬,考えないといけません。これよりもちょっと複雑な例になると,思わぬところでループから抜けてしまったり,永久ループに陥ってしまったり――という失敗をすることがあります。頭に「この配列の要素全部」と浮かんだ時,イテレータを使えれば何も悩むことがなくリスト3のようなコードを短く書くだけで済みます。

 ちなみにRubyでもfor文が利用できますが,筆者はおおむねイテレータのシンタックス・シュガーと考えています。

Perl同様のハッシュがありイテレータも使える

 Rubyにも,Perlと同様のハッシュ(連想配列)が利用できます。RubyのハッシュにはRubyのオブジェクトであればなんでも入ります。入れ子もできます。

 Rubyのハッシュは以下のような書式です。

{ キー1 => 値1 , キー2 => 値2 … }

 配列同様,どのようなオブジェクトでもハッシュのキーになれますが,扱いやすさや効率から,キーにはStringオブジェクトが使われることが多いです。例えば,以下のような感じです。

  meisan = { "sanuki" => "udon" ,
  "shinshu" => "soba" }
  print meisan["sanuki"]

最後のprintは,ハッシュのキー「sanuki」に対応する値「udon」を画面に出力します。

 ハッシュに対してもイテレータが利用できます。ハッシュのキーだけを処理したいときは,

  meisan.each_key{ |basho| …

と「each_key」メソッドを利用します。

  meisan.each_value{ |tabemono| …

とすれば同様に,ハッシュの値だけを処理できます。

 なお,ハッシュにもeachメソッドがあります(リスト4)。(8)の行で「basho」と「tabemono」を指定しています。リスト4の実行結果は図3です。ハッシュに格納した順番通りに表示されていない場合があることに注意してください。ハッシュは,配列と違って,順番を保証しません。リスト4の例では,「讃岐」と「信州」のどちらが先に表示されるかは,処理系の実装に依存します。

リスト4●ハッシュに対してイテレータを利用した例
リスト4●ハッシュに対してイテレータを利用した例
図3●リスト4の実行結果
図3●リスト4の実行結果

if,unlessなどの制御構造を知る

 ループを解説したので,次は分岐を解説します。あまり特徴的ではありませんので,さっと眺めて感じだけつかんでください。まずは条件分岐のif文です。

if 条件
#条件が真の場合に実行する
end