たのしいRuby(第2版) 「はじめてのRuby」〜制御構造の概要とif 〜
■これは「たのしいRuby 第2版」を元にしています。
http://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84Ruby-%E7%AC%AC2%E7%89%88-Ruby%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E6%B0%97%E8%BB%BD%E3%81%AA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%AB%98%E6%A9%8B-%E5%BE%81%E7%BE%A9/dp/4797336617/ref=pd_sim_b_img_6/250-4677527-6737860
制御構造の分類
制御構造を大雑把に分類すると次のようになります。
・逐次処理 : プログラムを書かれた通りに、先頭から順に実行する
・条件判断 : ある条件が成り立つ場合は○○を、そうでない場合は、××を実行する
・繰り返し : ある条件が成り立つ間、○○を繰り返し実行する
・例外処理 : 何か例外が発生した場合には、○○を実行する
ふむ。では、1つ1つ見ていきましょう。
逐次処理
逐次処理というのは、通常の処理のことです。特に何も指定していない場合、プログラムは書かれた順に実行されます。
これ、意外と重要かと思います。
僕、プログラムをやり始めた当初、とある瞬間に「あ!!プログラムって上から下に順番に実行されるんだ!!」と気づきwwwwだいぶ楽になったのを覚えています。
それにしても、やり始めの練習プログラムで、上から下に流れなかったらどういうプログラムを書いて、どういう風に理解していたのでしょうかwwwwいまでは不明ですwwww
条件判断
ある条件によって挙動が変わるプログラムを作るには、if文を使います。if文の構文は、以下のようになります。
if 条件 then
実行したい処理
end条件には、値がtrueまたはfalseとなる式を書くのが一般的です。
ふむふむ。
では、「値がtrueまたはfalseとなる式」とはなんでしょうか。
2つの値を比較して、一致すればtrue、一致しなければfalse、などが条件にあたります。
数値の場合、たとえば大小関係の比較には、等号や不等号を使います。Rubyでは、「=」は代入のための記号として使われるので、一致するかどうか調べるには「=」を2つ並べた記号「==」を使います。また、「≦」と「≧」には、「<=」と「>=」を使います。
このような比較の結果はtrueまたはfalseとなります。もちろん、trueはその条件が成り立っている場合、falseは成り立っていない場合です。
なるほど、条件がtrueまたはfalseになるのかやってみましょう。
- プログラム
p (2 == 2) p (1 == 2) p (3 > 1) p (3 > 3) p (3 >= 3) p (3 < 1) p (3 < 3) p (3 <= 3)
- 実行結果
C:\enjoy_ruby>ruby helloruby.rb true false true false true false false true
おお。なりましたねー。
では、これを使って if 文を書いてみましょう。
- プログラム
a = 9 #例1 if a < 10 print "aは10より小さいです!\n" end #例2 if a > 1 print "aは1より大きいです!\n" end #例3 if a > 10 print "aは10より大きくない!\n" end
上記のプログラムの例1と例2はtrueを返すので実行されます、例3の条件はfalseを返すので実行はされないはずです。実行してみましょう。
- 実行結果
C:\enjoy_ruby>ruby helloruby.rb aは10より小さいです! aは1より大きいです!
ちゃんと条件はあってますね。trueの部分だけ実行されました。
文字列比較
文字列も比較できます。この場合も「==」を使います。同じ文字列ならtrue、異なる文字列ならfalseを返します。
ふむ。やってみましょう。
- プログラム
p ("Ruby" == "Ruby") p ("Ruby" == "ruby")
- 実行結果
C:\enjoy_ruby>ruby helloruby.rb true false
なりましたね。
値が異なっていることを判断するには、「!=」を使います。これは「≠」の意味ですね。
ふむ。やってみましょう。
- プログラム
p ("Ruby" != "Ruby") p ("Ruby" != "ruby")
- 実行結果
C:\enjoy_ruby>ruby helloruby.rb false true
「==」とは逆の結果になりましたね。
条件判断文を書いてみよう
- プログラム
a = 20 if a >= 10 then print("bigger\n") end if a <= 9 then print("smaller\n") end
- 実行結果
C:\enjoy_ruby>ruby helloruby.rb bigger
変数aは10より大きいですから結果は"bigger"ですね。
thenは省略できる
thenは省略することもできます。
やってみましょう。
- プログラム
a = 20 if a >= 10 print("bigger\n") end if a <= 9 print("smaller\n") end
- 実行結果
C:\enjoy_ruby>ruby helloruby.rb bigger
大丈夫ですね。
ちなみに、thenが書いてあるプログラムはほとんどみないですね・・・。
else
また、条件に一致するときとしないときで違う動作をさせたい場合は、elseを使います。以下のような構文になります。
if 条件 then
条件が成り立ったときに実行したい処理
else
条件が成り立たなかったときに実行したい処理
endこれを使って、先ほどの条件判断文を書き直すと以下のようになります。
- プログラム
a = 20 if a >= 10 print("bigger\n") else print("smaller\n") end
- 実行結果
C:\enjoy_ruby>ruby helloruby.rb bigger
もっとif
if はtrueとfalseの条件しか判断できないのでしょうか。
そんなことはありません。
こちらに、
プログラミング言語 Ruby リファレンスマニュアル
つまり、
- プログラム
if false else print("ifでflaseは為\n") end if nil else print("ifでnilも為\n") end if 0 print("Rubyは0も真\n") end if "a" print("文字列も真\n") end if 1 print("数値も真\n") end
- 実行結果
C:\enjoy_ruby>ruby helloruby.rb helloruby.rb:19: warning: string literal in condition ifでflaseは為 ifでnilも為 Rubyは0も真 文字列も真 数値も真
となります。
ちなみに、PHPだと0は為になります。他の言語を触っている人はRubyの仕様をしっかりと把握しましょう。
if "文字列" だと「warning: string literal in condition」と注意が出るようですね。
elsif
Ruby では if を繋げるのは elsif であり、else if (C のように)でも elif(sh のように)でもないことに注意してください。
以下の例をみてみましょう。
- プログラム
a = 2 if a==1 print("aは1です!") elsif a==2 print("aは2です!") else print("aは1,2意外です!") end
- 実行結果
C:\enjoy_ruby>ruby helloruby.rb aは2です!
このように複数の条件で分岐することも可能です。
if 修飾子
文法:
式 if 式右辺の条件が成立する時に、左辺の式を評価してその結果を返します。 条件が成立しなければ nil を返します。
プログラム例
- プログラム
def if_nil "" if false end print "ifが成立すると出力\n" if true p if_nil
- 実行結果
C:\enjoy_ruby>ruby helloruby.rb ifが成立すると出力 nil
※「条件が成立しなければ nil 」がちゃんと返るか実験するために、メソッド化しています。
ちゃんと出力されましたね。
※条件分岐はif以外にも unless case があります。これは別途やります。
プログラミング言語 Ruby リファレンスマニュアル
環境
C:\enjoy_ruby>ruby -v ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]