連載
» 2014年03月27日 18時00分 公開

若手エンジニア/初心者のためのRuby 2.1入門(2):Ruby 2.1の基本構文/基本文法まとめ&Pryの使い方 (5/7)

[著:麻田優真、監修:山根剛司,株式会社アジャイルウェア]

if

 「if」は最も基本的な条件分岐の式です。「if」というキーワードに続く式の戻り値が真の場合に、「if」と「end」で囲まれた部分が実行されます。

基本形

the_answer = 42
if the_answer == 42
  puts "Executed!"
end
sample01.rb
$ ruby sample01.rb
Executed!
sample01.rbの実行結果

 もし、「the_answer」に42ではないオブジェクトが入っていた場合、ifとendで囲まれた部分は実行されません。

the_answer = 24
if the_answer == 42
  puts "Executed!"
end
sample02.rb
$ ruby sample02.rb
 
(何も表示されない)
sample02.rbの実行結果

elseを利用した条件分岐

 「else」というキーワードを使うことで、条件式が真の場合と偽の場合で処理を分けることができます。

the_answer = 42
if the_answer == 42
  puts "TRUE"
else
  puts "FALSE"
end
sample03.rb

 この場合、「the_answer」の値が42のときはTRUEが出力され、そうではない場合、FALSEが出力されます。「the_answer」に代入する値を、いろいろ変えて試してみてください。

条件演算子

 条件演算子は、trueもしくはfalseを出力する演算子です。条件分岐や繰り返しで用いることが多いです。

表4 Rubyの主要な条件演算子
演算子 意味
== 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
sample04.rb
$ ruby sample04.rb 24
24 is between -42 and 42
$ ruby sample04.rb -100
-100 is not between -42 and 42
sample04.rbの実行結果

 連載第1回で使った、コマンドライン引数を取得するための「ARGV」を利用しています。「ARGV[0]」に続く「to_i」は、オブジェクトを整数に変換するメソッドです。「ARGV」を通して取得できるコマンドライン引数は文字列なので、整数として比較する場合は、「to_i」を使って変換する必要があります。

後置if

 ifを使って実行したい文が1行で済む場合、「後置if」を使うとスッキリと書けます。sample05.rbは、後置ifを使ってsample01.rbを書き換えたものです。

the_answer = 42
puts "Executed!" if the_answer == 42
sample05.rb
$ ruby sample05.rb
Executed!
sample05.rbの実行結果

ifの戻り値

 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
sample06.rb
teapot = if ARGV[0].to_i == 42
  "tea"
else
  "coffee"
end
puts teapot
sample07.rb

 このテクニックは、以降で説明するunlessやcaseでも使えます。

補足「Rubyにおける条件の真偽」

 Rubyでは、条件式の戻り値が「nilでもfalseでもない」場合に真とみなされます。つまり、「trueの場合だけ真とみなされるわけではない」ことに注意してください。従って、以下のsample08.rbでは、「teapot」が文字列を返す(つまりnilでもfalseでもない)ため、「Executed!」が出力されます。

teapot = "tea"
puts "Executed!" if teapot
sample08.rb

unless

 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
sample09.rb
$ 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
sample09.rbの実行結果

case

 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
sample10.rb
$ 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
sample10.rbの実行結果

 whenに続けて書かれた式とcaseに続けて書かれた式を比較し、一致した部分を実行します。また、6行目のように、コンマに続けて複数の式を書くこともできます。8行目では、「else」を使って「それ以外」の場合を記述しています。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。