工藤探偵事務所

Resarch and Investigation

ルビー3分クッキング 第九回「選択は幻想」の巻

kudo-shunsaku2008-04-10




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

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


第九回は、「選択は幻想」の巻です。

今回は「制御構造」ということで、まず基本となる "if" 文での条件分岐をやってみましょう。

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

# 今夜のメニューです。
menu = "Spaghetti alla Carbonara"

# 料理を頂く食器を選びます。
if menu =~ /Spaghetti/ then
    eating_irons = "fork and spoon"
elsif menu =~ /Steak/ then
    eating_irons = "knife and fork"
else
    eating_irons = "chopsticks"
end

puts "eat with " + eating_irons + "."

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

C:\rubycode\3minutes2cooking>ruby if_else_end.rb
eat with fork and spoon.

C:\rubycode\3minutes2cooking>

説明しなくても大体の流れは想像できるかと想います。

注意は、C言語(もしくは Java言語 や Cシェル)などで使う "else if" と同じ意味で Ruby では "elsif" がキーワードです。 Bourne Shellとかで使うのは "elif" ですよ。 Visual Basic だと "ElseIf" らしいですしね。間違えやすいので注意しましょ。私は既に混乱してますけどね。

それと条件分岐の終わりは "end" です。省略できませんので必ず書きましょう。

"if", "elsif" で評価する「条件式」が「真」若しくは「偽」で判断し、それぞれの状況に併せて分岐させて実行することが出来ます。

詳しくは後ほど。

では、ちゃんと条件分岐できているのか与える「値」を変えて再度確認します。

先ほどのソースコードを変更します。

# 今夜のメニューです。
#menu = "Spaghetti alla Carbonara"
menu = "Hamburg Steak"
#menu = "pork cutlet & rice in bowl"

# 料理を頂く食器を選びます。
if menu =~ /Spaghetti/ then
    eating_irons = "fork and spoon"
elsif menu =~ /Steak/ then
    eating_irons = "knife and fork"
else
    eating_irons = "chopsticks"
end

puts "eat with " + eating_irons + "."

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

C:\rubycode\3minutes2cooking>ruby if_else_end.rb
eat with knife and fork.

C:\rubycode\3minutes2cooking>

上記のようにメニューを色々変えてみて、ちゃんと料理に合った食器が出てくれるのか?確かめてみましょう。メニューを変えるには、変数に代入する文を幾つか用意して、コメントにしたりすれば簡単に出来ます。コメントにするには "#" をつけます。

ここで「条件式」として使っているのは、文字列とのマッチングの結果です。Rubyでは正規表現が使えて文字列とのマッチングのための演算子(メソッド)として ' =~ ' という記号が使えます。

正規表現はいつか説明します、いつか。。。気長にお待ち下さい。

文字列と比較した結果、指定のパターンが含まれていればそのマッチした位置(インデクス、数字)を返します。

そこで一番大事な事が発覚するのですが、Ruby での「真偽値」についてです。

Ruby では、「偽」の値だけが決められています。
Rubyで「偽」として認識されるのは、"nil" もしくは "false" です。
"nil" と "false" はキーワード(予約語)です。
ですから、false でも nil でもない値は全て「真」となります。
数字の「0」も空の文字列もぜんぶ真です。

ここでは、指定したパターンが文字列に含まれていなければ、"nil" が返ってきます。

「偽は "nil" と "false" です。」というのを確かめてみましょう。

先ほどのソースコードを変更します。

# 料理を頂く食器を選びます。
if nil
    eating_irons = "fork and spoon"
elsif false
    eating_irons = "knife and fork"
else
    eating_irons = "chopsticks"
end

puts "eat with " + eating_irons + "."

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

C:\rubycode\3minutes2cooking>ruby if_else_end.rb
eat with chopsticks.

C:\rubycode\3minutes2cooking>

今度はメニュー(変数)で条件式与える代わりに直接「偽」のキーワードをおきました。

そしてこの条件式の箇所に数字や文字列(特に数字の「0」や「空」の文字列)などを与えてどうなるのか?納得するまで試して下さいませ。

それと条件式の後ろの "then" は省略出来ます。Javaなどのプログラミング言語を知ってる方は "then" を付けないのが自然でしょうし、管理者としてシェル・スクリプトを作っている方は "then" をつけた方が読みやすいかもしれません。ご自分が馴染んでいる方で記述して下さいませ。

もう一つ便利な条件分岐が出来ます。"unless" です。意味はちょうど "if"文の反対になります。

やってみましょう。

# 今夜のメニューです。
menu = "Hamburg Steak"
#menu = "pork cutlet & rice in bowl"

# 料理を頂く食器を選びます。
unless menu =~ /rice/ 
    eating_irons = "knife and fork"
else
    eating_irons = "chopsticks"
end

puts "eat with " + eating_irons + "."

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

C:\rubycode\3minutes2cooking>ruby unless.rb
eat with knife and fork.

C:\rubycode\3minutes2cooking>

「〜で無かったなら」という表現の仕方が簡素で簡易な場合も多いと想いますので、そんな時に有効に使えることでしょう。

今回は条件分岐の "if" と "unless" 文をご紹介しました。これを覚えると少しプログラムらしいものが書けるようになるかもしれません。Ruby では、まだ他にも色々な制御構造がありますので次回以降にご紹介できればと考えております。




「たら〜こ〜♪たっぷり♪たっぷり♪た〜らこ〜♪」

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


オマケ:

キグルミ - たらこ・たらこ・たらこPV on YouTube
http://www.youtube.com/watch?v=vAtBNOKT8jM