「if」は最も基本的な条件分岐の式です。「if」というキーワードに続く式の戻り値が真の場合に、「if」と「end」で囲まれた部分が実行されます。
the_answer = 42 if the_answer == 42 puts "Executed!" end
$ ruby sample01.rb Executed!
もし、「the_answer」に42ではないオブジェクトが入っていた場合、ifとendで囲まれた部分は実行されません。
the_answer = 24 if the_answer == 42 puts "Executed!" end
$ ruby sample02.rb (何も表示されない)
「else」というキーワードを使うことで、条件式が真の場合と偽の場合で処理を分けることができます。
the_answer = 42 if the_answer == 42 puts "TRUE" else puts "FALSE" end
この場合、「the_answer」の値が42のときはTRUEが出力され、そうではない場合、FALSEが出力されます。「the_answer」に代入する値を、いろいろ変えて試してみてください。
条件演算子は、trueもしくはfalseを出力する演算子です。条件分岐や繰り返しで用いることが多いです。
演算子 | 例 | 意味 |
---|---|---|
== | x == y | xとyは等しい |
!= | x != y | xとyは等しくない |
< | x < y | xはyより小さい |
> | x > y | xはyより大きい |
<= | x <= y | xはy以下 |
>= | x >= y | xはy以上 |
>> | x >> y | xをy回右シフト |
&& | x && y | xとyの論理積 |
and | x and y | xとyの論理積 |
|| | x || y | xとyの論理和 |
or | x or y | xとyの論理和 |
! | !x | xの否定 |
not | not x | xの否定 |
「not」「and」「or」は、「!」「&&」「||」よりも優先度が低く設定されています。筆者としては、「and」をはじめとしたアルファベットを使う記法が好みです。
sample04.rbは、コマンドライン引数に与えられた値が、-42から42の間に含まれているかを調べるプログラムです。
num = ARGV[0].to_i if num >= -42 and num <= 42 puts "#{num} is between -42 and 42" else puts "#{num} is not between -42 and 42" end
$ ruby sample04.rb 24 24 is between -42 and 42 $ ruby sample04.rb -100 -100 is not between -42 and 42
連載第1回で使った、コマンドライン引数を取得するための「ARGV」を利用しています。「ARGV[0]」に続く「to_i」は、オブジェクトを整数に変換するメソッドです。「ARGV」を通して取得できるコマンドライン引数は文字列なので、整数として比較する場合は、「to_i」を使って変換する必要があります。
ifを使って実行したい文が1行で済む場合、「後置if」を使うとスッキリと書けます。sample05.rbは、後置ifを使ってsample01.rbを書き換えたものです。
the_answer = 42 puts "Executed!" if the_answer == 42
$ ruby sample05.rb Executed!
ifの戻り値は、処理の中で最後に実行した式の戻り値となります。その性質を利用することで、ちょっとトリッキーですがsample06.rbをsample07.rbのように、スッキリと書き換えることができます。
sample06.rbとsample07.rbは、コマンドライン引数の値が42の場合には変数「teapot」に「"tea"」を代入し、そうではない場合は「"coffee"」を代入するプログラムです。
teapot = "" if ARGV[0].to_i == 42 teapot = "tea" else teapot = "coffee" end puts teapot
teapot = if ARGV[0].to_i == 42 "tea" else "coffee" end puts teapot
このテクニックは、以降で説明するunlessやcaseでも使えます。
Rubyでは、条件式の戻り値が「nilでもfalseでもない」場合に真とみなされます。つまり、「trueの場合だけ真とみなされるわけではない」ことに注意してください。従って、以下のsample08.rbでは、「teapot」が文字列を返す(つまりnilでもfalseでもない)ため、「Executed!」が出力されます。
teapot = "tea" puts "Executed!" if teapot
unlessはifとは逆に、条件式が偽の場合に続く式を実行します。ifと同様、elseを使えますし、後置することもできます。sample09.rbは、unlessを使ってコマンドライン引数に与えられた値が42より大きくないかそうでないかを判定するプログラムです。
unless ARGV[0].to_i > 42 puts "#{ARGV[0]} is not lager than 42" else puts "#{ARGV[0]} is lager than 42" end
$ ruby sample09.rb 43 43 is lager than 42 $ ruby sample09.rb 42 42 is not lager than 42 $ ruby sample09.rb 24 24 is not lager than 42
caseは、比較対象のオブジェクトの戻り値によって、複数に処理を分岐するために使います。C言語に影響を受けたプログラミング言語で使われる「switch」に似ています。sample10.rbに、caseを使ってコマンドライン引数に与えられた値によって処理を分岐させる例を示します。
case ARGV[0].to_i when 0 puts "zero" when 1 puts "one" when 2, 3 puts "two or three" else puts "other" end
$ ruby sample10.rb 0 zero $ ruby sample10.rb 1 one $ ruby sample10.rb 2 two or three $ ruby sample10.rb 3 two or three $ ruby sample10.rb 4 other $ ruby sample10.rb -100 other
whenに続けて書かれた式とcaseに続けて書かれた式を比較し、一致した部分を実行します。また、6行目のように、コンマに続けて複数の式を書くこともできます。8行目では、「else」を使って「それ以外」の場合を記述しています。
Copyright © ITmedia, Inc. All Rights Reserved.