たのしい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

制御構造

 プログラミング言語には、制御構造というものがあります。
 これは、何かの条件によって、プログラムの実行順序を変えたり、プログラムの一部を実行させなかったりするための仕組みです。

ふむ。


プログラミング言語 Ruby リファレンスマニュアル


制御構造の分類

制御構造を大雑把に分類すると次のようになります。

 ・逐次処理 : プログラムを書かれた通りに、先頭から順に実行する
 ・条件判断 : ある条件が成り立つ場合は○○を、そうでない場合は、××を実行する
 ・繰り返し  : ある条件が成り立つ間、○○を繰り返し実行する
 ・例外処理 : 何か例外が発生した場合には、○○を実行する

ふむ。では、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 リファレンスマニュアル

Ruby では false または nil だけが偽で、それ以外は 0 や空文 字列も含め全て真です。

つまり、

  • プログラム
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 リファレンスマニュアル

 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 修飾子

プログラミング言語 Ruby リファレンスマニュアル

文法:
式 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]