工藤探偵事務所

Resarch and Investigation

ルビー3分クッキング 第七回「繰り返しの不思議」の巻

kudo-shunsaku2008-04-05



3分間で覚える Ruby のトピックスです。
でも、本家同様に実際には10分程度掛かります。

大事なのは小さな積み重ねと継続する才能ですね。
一番の怠け者の俺が言うのも変ですけどね。


第七回は、「繰り返しの不思議」の巻です。

今回は Ruby 言語の中でも目立って不思議な書き方をご紹介します。

それは "each" というメソッド(関数)でよく使われます。この(ブロック付き)メソッドでは、繰り返し(ループ)の処理などを簡易に行うことが出来るものです。

でも、これに出遭うとあまり見慣れない書き方ですので戸惑ったりしますが、至極強力な書き方です。

しかもこれに慣れると Ruby をマスターした気分になれるので、結構良いかもしれませんよ。

まずは一番目にするであろう配列を例にとってご紹介します。

ファイル名は、"array_each.rb" などとして下さい。

#! ruby -Ks

# ポークカレーの材料を配列に用意します。
pork_curry = [ "葫", "豚肉", "玉葱", "人参", "馬鈴薯", "水", "カレールー" ]

# 順番に炒めた後に鍋入れて水を加えて行きます。
pork_curry.each { |ingredient|
    puts ingredient + "を鍋に入れます。"
}
puts "ポークカレーの出来上がりです。"

実行時、コンソール画面。

C:\rubycode\3minutes2cooking>ruby array_each.rb
葫を鍋に入れます。
豚肉を鍋に入れます。
玉葱を鍋に入れます。
人参を鍋に入れます。
馬鈴薯を鍋に入れます。
水を鍋に入れます。
カレールーを鍋に入れます。
ポークカレーの出来上がりです。

C:\rubycode\3minutes2cooking>

"each" メソッドを使うと、配列に入っている要素に対して順番に処理できることがわかります。何だか不思議な書き方ですけど、便利ですね。

"each" メソッドの後ろに "{...}" (ブレース)で括ってありますが、ここが繰り返しの処理を行う箇所です。これを「ブロック」と呼ぶそうです。なので "each" などのメソッドを「ブロック付きメソッド」と呼んだりするようです。

ところでブロックの中で仮変数 "ingredient" (料理の材料)が用意されていますが、配列の要素がここに順番に入ってきて、その値が処理される。という流れです。

繰り返しが行わる際に要素が順番に処理されて、ポークカレーが出来ました。
ですが、水を入れる前によく炒めてから煮込んで下さい。
特に、最初に葫を焦がさないように注意しましょう。

次にブロックは "{...}" (ブレース)ではなく、"do...end" で囲むことも出来ます。(実は、ちょっとだけ意味が違います。)

先ほどのコードを書き換えます。

#! ruby -Ks

# ポークカレーの材料を配列に用意します。
pork_curry = [ "葫", "豚肉", "玉葱", "人参", "馬鈴薯", "水", "カレールー" ]

# 順番に炒めた後に鍋入れて水を加えて行きます。
# こんどは順番も書いておきます。
pork_curry.each_with_index do |ingredient, idx|
    puts((idx+1).to_s + "番目に" + ingredient + "を鍋に入れます。")
end
puts "よく煮込んでポークカレーの出来上がりです。"

実行時、コンソール画面。

C:\rubycode\3minutes2cooking>ruby array_each.rb
1番目に葫を鍋に入れます。
2番目に豚肉を鍋に入れます。
3番目に玉葱を鍋に入れます。
4番目に人参を鍋に入れます。
5番目に馬鈴薯を鍋に入れます。
6番目に水を鍋に入れます。
7番目にカレールーを鍋に入れます。
よく煮込んでポークカレーの出来上がりです。

C:\rubycode\3minutes2cooking>

先ほどと同じように要素を順番に実行できました。今回は入れる順番を出力したかったので、
配列のメソッドで添え字も取れる "each_with_index" を使ってみました。

ですが配列の添え字(インデクス)は、"0" から始まるので "+1" してあります。

くどいようですが、水を入れる前によく炒めてから煮込んで下さい。
くれぐれも葫を焦がさないように注意しましょう。

今度は違う文字エンコーディングも試してみましょう。

ついでにハッシュでも "each" で繰り返ししてみましょう。

先日の基本の調味料を確認します。

#! ruby -Ks

# 基本の調味料です。
basic_seasoning = {"さ"=>"砂糖", "し"=>"塩","す"=>"酢","せ"=>"醤油","そ"=>"味噌"}
basic_seasoning.each { |spice_key, seasoning|
    puts spice_key + "は、" + seasoning + "ですよ。"
}

実行時、コンソール画面。

C:\rubycode\3minutes2cooking>ruby array_each.rb
しは、塩ですよ。
すは、酢ですよ。
せは、醤油ですよ。
そは、味噌ですよ。
さは、砂糖ですよ。

C:\rubycode\3minutes2cooking>

ハッシュでも要素を繰り返し処理できました。でもハッシュは配列とは違って順番に並んでいないので、気をつけて下さいませ。

ハッシュの "each" 場合には、「キー (Key)」と「値 (Value)」がありますので、それぞれを仮引数に取り出すことが出来ます。また "each_key", "each_value" といったそれぞれだけを取り出すメソッドもあります。


今回は "each" などのブロック付きメソッドで繰り返しの処理ををやってみました。
これ以外にもブロック付きメソッドは、沢山あります。またブロックは奇異な書き方に見えますが、とても簡単に処理を書けるので便利です。他にも色々な使い方が出来るようですし、是非使いましょう。

ちなみに普通の言語で繰り返しと言えば "forループ" 文などで書きますすが、Ruby でも勿論使えます。でも Ruby で "for" を使うと実際には "each" になるそうです。そのように解釈されるらしいです。つまり "for" は、実は "each" なんだそうです。

このことを「シンタックス・シュガー」と呼ぶそうです。人に読みやすくするための目的だそうです。甘くしてくれるんですね。

条件判断や繰り返しの話はまたいつか。



「たらこー♩たらこー♩つ〜ぶぅつ〜ぶぅ♫たらこー♩」

今日はここまで。次回をお楽しみに。