今までは、プログラムを上から下に順番に書いてきました。 書いたプログラムは、どの行も実行されたわけです。 ここでは、ある条件のときだけ実行する方法を紹介します。
世間は条件判断だらけです。「腹が減ったらご飯を食べる」「夜ならば寝る」「雨が降っていたら傘をさす」 「信号が赤なら止まる」…。
言うまでもないことですが、「腹が減ったらご飯を」の場合は、「腹が減ったら」が条件で、 その条件が成り立つときに、「ご飯を食べる」を実行するわけです。
まずは、簡単にコンピュータで扱いやすい数値を使った条件判断をやってみます。 2つの数値を比較してみましょう。例えば、10と15を比較したのが以下のプログラムです。
1: # 2つの数値を比較するプログラム 2: if (10 < 15) then 3: print "10は15より小さい\n" 4: end
1行目はコメントです。プログラムの動きには影響しません。 2行目で 10 < 15 とあるのがif文の条件です。 Rubyで条件判断をする場合は、通常このif文を使います。 この場合、10 < 15 が成り立つ場合には、then以下の3行目を実行します。 4行目にはif文の終わりを示す end が書かれています。 この場合、10 < 15 が成り立つので 10は15より小さい が表示されるはずです。
次に、2行目の条件を 10 > 15に変えてみましょう。
1: # 2つの数値を比較するプログラム 2: if (10 > 15) then 3: print "10は15より大きい\n" 4: end
実行しても何も表示されません。 if文の条件である 10 > 15が成り立たないため、3行目が実行されなかったからです。
他に数値の比較の仕方には以下のようなものがあります。色々試してみてください。 特に注意しないといけないのは、等式です。 数学では、等式を = と書きますが、Rubyでは == と書きます。 Rubyの場合 = は、代入を意味するからです。ここは良く間違うところなので、常に気をつけてください。また、<=, >= を =<, => と書いてはいけません。
書き方 意味 備考 a == b a と b が等しいかどうか = と書き間違わないよう注意 a != b a と b が等しくないかどうか a < b a が b より小さい(未満)かどうか a <= b a が b 以下かどうか =< と書き間違わないよう注意 a > b a が b より大きいかどうか a >= b a が b 以上かどうか => と書き間違わないよう注意
表のaやbには数値や数値が入っている変数の名前を入れてください。以下に例を示します。
a = 25 if (a < 50) then print "赤点です!\n" end
1: score = 100 2: if (score == 100) then 3: print "100点満点。" 4: print "アンタはエライ!\n" 5: end
下側の例(if4.rb)のように、if文の中に複数の行を書くこともできます。 この例だと、scoreが100の場合は、3行目と4行目を実行します。
以上は、条件が成り立つときに何か実行する、という形ですが、成り立たないときも 何か実行することができます。以下の例を見てください。
1: a = 60 2: if (a < 50) then 3: print "赤点です!" 4: else 5: print "合格点です" 6: end
この場合、a < 50 が成り立つときは、3行目(then から else の間)を実行し、 成り立たないときは、5行目(else から end の間)を実行します。
# 2つの整数値のうち値の大きいほうを表示するプログラム a = 100 b = 50 if (a < b) then print b, "\n" else print a, "\n" end
以上は数値の比較をしましたが、文字列を比較するということもできます。 2つの文字列が同じかどうかを比較するのに、==(等しい)と !=(等しくない)が使えます。
name = "Bill" if (name == "Bill") then print "Billさんに間違いありません\n" end
name = "Steve" if (name != "Bill") then print "Billさんではないようです\n" end
二つの条件がどちらも成り立つときに何か実行したい場合は、以下の2つの方法があります。
例えば、mathに数学の点数、englishに英語の点数を入れておき、 両方とも50点以上なら 進級決定と表示するプログラムは以下のように書けます。
math = 75 english = 45 if (math >= 50) then if (english >= 50) then print "進級決定\n" end end
print文に辿り着くには、math >= 50 と english >= 50 の両方が成り立たないといけないからです。
&& を使うと、以上のプログラムは以下のように書けます。
math = 75 english = 45 if (math >= 50 && english >= 50) then print "進級決定\n" end
&& を使うと、2つの条件のどちらも成り立つ場合のみ成り立ちます(上記の場合print文が実行されます)。 例えば、math >= 50 は成り立つが、english >= 50 が 成り立たない場合、 math >= 50 && english >= 50 は成り立ちません。
以下の表を見て理解してください。表の中の○はその項目が「成り立つ」こと、×は「成り立たない」ことを示します。このような表を真理値表といいます。
math >= 50 english >= 50 math >= 50 && english >= 50 ○ ○ ○ ○ × × × ○ × × × ×
このような「成り立つ」、「成り立たない」ということを扱う学問を論理学といいます。 論理学の中で一番基本的な命題論理では、「成り立つ」ことをtrue(真)、「成り立たない」 ことをfalse(偽)といいます。上の表であれば、○がtrue、×がfalseです。
Rubyも以上の命題論理に基づいた論理型というデータ型で条件判断をするのが基本です。 論理型はtrueとfalseの2つの値しか取りません。今までの例でいうと、math >= 50 や english >= 50 という式は結果としてtrueかfalseのどちらかの値になります。 もちろん math >= 50 && english >= 50 も同様です。
# 絶対に成り立つif文 if (true) then print "成り立つ\n" end
# 0 はfalseでもnilでもないので成り立つ if (0) then print "成り立つ\n" end逆に以下の例では絶対にprint文は実行されません。
# 絶対に成り立たないif文 if (false) then print "成り立つ\n" end
&& とは対象的に、2つの条件のどちらかが成り立てば、成り立つという表現もあります。
math = 100 english = 45 if (math == 100 || english == 100) then print "とりあえず満点があるから許してやろう\n" end
この場合、数学か英語のどちらかでも100点であれば、print文が実行されます。
これも真理値表を見て理解してください。
math == 100 english == 100 math == 100 || english == 100 true true true true false true false true true false false false
「成り立つ」「成り立たない」をあべこべにする ! という表現もあります。
math = 100 if (!(math >= 50)) then print "赤点です!\n" end
この例の場合、点数が50点以上でない場合にprint文が実行されます。
表にまとめると以下のようになります。
math >= 50 !(math >= 50) true false false true
この場合 !(math >= 50)という風にカッコをつけないといけないことに注意してください。 カッコをつけない、つまり !math >= 50 と書くと、(!math) >= 50 という意味になってしまいます。
勘のいい人なら、!(math >= 50) は math < 50 と同じ結果になることに気づくでしょう。
!(math == 50) !(math != 50) !(math > 50)