すでにメンバーの場合は

無料会員登録

GitHubアカウントで登録 Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

登録がまだの方はこちらから

Pikawakaにログイン

GitHubアカウントでログイン Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

Rails

【Rails】 4.Rubyの条件分岐を学ぼう

ぴっかちゃん
ぴっかちゃん

この記事では、制御構造のひとつである条件分岐について学びます。

※ カリキュラムでは、Cloud9のターミナルやエディタを利用します。
まだ用意していない方は「AWS Cloud9を準備しよう」を参考に導入してください。

基本的な制御構造を知っておこう

コンピュータは、プログラムに記述された手順通りに動作します。

そのため、プログラムを作成する際には「どのように処理を実行させるか」といった処理手順(アルゴリズム)をしっかり考えて組み立てます。

「処理手順」というと難しく感じるかもしれませんが、基本的には以下の3つの制御構造を組み合わせて作ることができます。

基本的な制御構造

制御構造とは、プログラムの実行手順を体系化したものです。その中でも「順次構造」「選択構造」「反復構造」は最も基本的な制御構造です。

この章では、図の中央に位置する「選択構造(条件分岐)」について学びます。

ポイント
  1. コンピュータはプログラムの手順通りに動作するので、処理手順が重要である
  2. 処理手順(アルゴリズム)は、どのように処理を実行させるかの手順のこと
  3. 処理手順は、順次構造・選択構造・反復構造の組み合わせで作ることができる

条件分岐について理解しよう

条件分岐とは、プログラムの中である条件が成り立つかによって、次に実行する処理を変えることです。

以下のフローチャートでは、条件が成り立つときはYesの矢印の先に進み「処理①」を実行します。条件が成り立たないときは、Noの矢印の先に進み「処理②」が実行されます。

条件分岐のフローチャート1

具体的な例として、「テストの点数が70以上なら合格と出力する、そうでなければ処理を終了する」で考えてみましょう。

この手順をフローチャートにすると、以下のように記述することができます。

条件分岐のフローチャート2

点数の定義後に「点数が70以上」という条件が成り立てば、Yesの矢印に進み「合格」と出力されます。条件が成り立たなければ、Noの矢印に進み、そのまま処理が終了します。

次に条件が成り立たないときに「不合格」と出力には、以下のように追記します。

条件分岐のフローチャート3

このように条件分岐は「条件が成り立つか、成り立たないか」によって、次に行う処理を変えることができます。

Rubyでは、ifunlesscaseを使うことで条件分岐させることができます。

この中でも条件分岐によく使われるifについて学んでいくよ

ぴかわかさん

ifの基本的な使い方を学ぼう

ifは「ある条件が成り立つときは処理①の処理を行い、成り立たないときは処理②を行う」など指定した条件に従って処理を分岐させたいときに使われます。

条件分岐のフローチャート4

また、ifは複数の条件を追加して、さらに処理を分岐させることもできます。

ifの基本的な使い方や処理の流れについて、具体例とフローチャートを使いながら学んでいきます。

ifの基本構文

ifの基本的な書き方は、以下の通りです。

if文の基本構文
1
2
3
if 条件式 then
  #条件が成り立つときに実行する処理
end

条件式には、比較演算子などを使って条件を記述し、then~endの間には、条件が成り立つときに実行したい処理を記述します。

条件式が評価(式を実行して値を得ること)されて、条件が成り立つときにthen以下の処理が実行されます。

それでは、実際に手を動かしながらifの使い方を学ぼう!

ぴかわかさん

ifを使って条件分岐してみよう

前述の例を使ってifでプログラムの処理を条件分岐してみましょう。

以下のフローチャートのように「テストの点数が70以上なら合格と出力、そうでなければ処理を終了」させます。

※ 実際のテストの点数は90点とします。点数にはscoreという変数を定義します。

条件分岐のフローチャート2

上記のフローチャートはifを使って記述すると、以下の通りになります。
以前作成したsample.rbに記述しておきましょう。

sample.rb | scoreが70以上なら合格と出力する
1
2
3
4
5
score = 90

if score >= 70 then
  puts "合格"
end

最初にテストの点数を定義します。
テストの点数は、90点なのでscore90を代入します。

次に「点数は70以上か」という条件をRubyで表現するために、比較演算子を使って「条件式」を指定します。「70以上」は70も含まれるので、>=を使います。

ぴっかちゃん

比較演算子で学んだa >= bは、「aはb以上」の意味だったよね

その通り!だからscore >= 70は、「score(点数)は70以上」の意味だと理解できるよね

ぴかわかさん
ポイント

条件が成り立つときに行いたい処理は、then~endの間に記述する

プログラムを実行して処理の流れを確認してみよう

続いて、rubyコマンドでプログラムを実行して処理の流れを確認します。

動画のようにrubyコマンドでプログラムを実行してみましょう。

ifの条件分岐の例を実行1

実行すると、ターミナルに「合格」と出力されましたね。

以下の画像で処理の流れを確認してみます。

scoreは70以上かが成り立つ

条件式はscore >= 70で、scoreは90なので「条件式は正しい」と判定されます。

つまり条件は成り立つので、then~end間のputs "合格"が実行され、「合格」と出力されます。

scoreを70未満にして処理の流れを確認してみよう

それでは、scoreを70未満にした場合はどのような処理の流れになるでしょうか。

以下のハイライト箇所のように、scoreを90から50に変更してみましょう。

sample.rb | scoreを90から50に変更する
1
2
3
4
5
score = 50
if score >= 70 then puts "合格" end

続いて、動画のようにrubyコマンドでプログラムを実行してみましょう。

ifの条件分岐の例を実行2

実行すると、ターミナルには何も表示されません。

以下の画像で処理の流れを確認してみます。

scoreは70以上かが成立しない

条件式はscore >= 70のままですが、scoreは50に変更したので「条件式は正しくない」と判定されます。

つまり条件は成り立たないので、puts "合格"は実行されず、ifの実行を終了します。そのため、ターミナルには何も出力されません。

ぴっかちゃん

条件が成り立たないときに何か処理させたい場合は、どうすれば良いの?

条件が成り立たないときの処理は、elseを使って実現できるよ

ぴかわかさん

条件が成り立たないときの処理

条件が成り立たないときに何かしら処理を行うには、以下のようにelseを使います。

elseの使い方
1
2
3
4
5
if 条件式 then
  #条件が成り立つ時に実行したい処理
else
#条件が成り立たない時に実行したい処理
end

else~endの間には、条件が成り立たないときに実行したい処理を記述します。

条件が成り立たないときの処理を書いてみよう

それでは、elseを使って条件が成り立たないときの処理を書いていきましょう。

以下のフローチャートのように「点数が70以上か」の条件が成り立たなければ、「不合格」と出力されるようにソースコードを変更していきます。

条件分岐のフローチャート3

以下のハイライト箇所のようにsample.rbの内容を変更しましょう。

sample.rb | 条件が成り立たない時の処理を記述する
1
2
3
4
5
6
7
score = 50

if score >= 70 then
  puts "合格"
else
puts "不合格"
end

条件が成り立たないときに実行したい処理はputs "不合格"なので、else~endの間に記述します。

sample.rbを変更したら、動画のようにrubyコマンドでプログラムを実行してください。

条件が成り立たない場合の処理を記述1

実行すると、ターミナルに「不合格」と出力されましたね。

以下の画像で処理の流れを確認してみます。

条件が成り立たない場合の処理を記述2

条件式はscore >= 70scoreは50なので「条件式は正しくない」と判定されます。

つまり条件は成り立たないので、else~end間のputs "不合格"が実行され、「不合格」と出力されます。

ぴっかちゃん

これだけだと「条件が成り立つか、成り立たないか」の2択しか分岐できないよね

さらに分岐が必要な場合はelsifを使うことで実現が可能だよ

ぴかわかさん
ポイント

条件が成り立たないときの処理は、elseを使って記述することができる

複数条件を指定して分岐させる場合

さらに条件を付け加える場合は、以下のようにelsifを使います。

elsifの使い方
1
2
3
4
5
6
7
if 条件式1 then
  #条件式1が成り立つ時に実行したい処理
elsif 条件式2 then
#条件式2が成り立つ時に実行したい処理
else #全ての条件が成り立たない時に実行したい処理 end

elseは1つだけしか使うことができませんが、elsifであれば以下のように必要な数だけ使うことができます。

elsifを複数使う場合
1
2
3
4
5
6
7
8
9
10
11
if 条件式1 then
  #条件式1が成り立つ時に実行したい処理
elsif 条件式2 then
#条件式2が成り立つ時に実行したい処理
elsif 条件式3 then
#条件式3が成り立つ時に実行したい処理
elsif 条件式4 then
#条件式4が成り立つ時に実行したい処理
else #全ての条件が成り立たない時に実行したい処理 end

条件式1から順番に判定されて、いずれかの条件が成り立つ時点でその箇所の処理が実行されて、ifの実行が終了します。

else以下に記述する処理は、「全ての条件が成り立たない場合」に実行されます。

まずはフローチャートを使って、複数条件を指定した場合の処理の流れを整理していこう

ぴかわかさん

フローチャートで処理の流れを整理しよう

elsifで条件を付け加えた場合の処理の流れを整理してみます。

フローチャートにすると、以下のように記述することができます。

フローチャート

処理開始後、最初に「条件式1」が成り立つか判断されます。成り立てば「処理①」が実行されて、ifの実行が終了します。

「条件式1」が成り立たないときは、次に「条件式2」が成り立つか判断されます。成り立てば「処理②」が実行されて、ifの実行が終了します。

「条件式2」も成り立たないときは「処理③」が実行されて、ifの実行が終了します。

ポイント
  1. ifの条件式が複数ある場合は、「条件式1」から順番に処理される
  2. 条件が成り立つ時点で、その節の処理が実行され、ifの実行も終了する
  3. 条件が全て成り立たないときは、else以下に記述する処理が実行される

elsifで条件を付け加えてみよう

それでは、実際にelsifを使って条件を付け加えてみましょう。

付け加える条件は「点数が60以上70未満」です。この条件が成り立てば、「不合格、もう少し!」と出力させます。

以下のハイライト箇所を編集してください。

sample.rb | elsifで条件を付け加える
1
2
3
4
5
6
7
8
9
score = 65
if score >= 70 then puts "合格"
elsif score >= 60 then
puts "不合格、もう少し!"
else puts "不合格" end

編集後、動画のようにrubyコマンドでプログラムを実行すると、ターミナルに「不合格、もう少し!」と出力されます。

elsifを追加した場合

最初に処理される条件式1はscore >= 70scoreは65なので「条件式は正しくない」と判定されます。つまり条件は成り立たないので「条件式2」へ処理が移ります。

条件式2はscore >= 60で条件が成り立つので、「不合格、もう少し!」と出力され、ifの実行も終了します。

elsifの注意点

elsifを使う場合は、条件式の順番に注意する必要があります。

なぜなら、条件式1から順番に処理され、条件が成立した時点でその節の処理が実行されて、ifが終了するからです。

実際に手を動かして確認してみましょう。以下のハイライト箇所を編集してください。

sample.rb | 条件式の順番を変更する
1
2
3
4
5
6
7
8
9
score = 90
if score >= 60 then
puts "不合格、もう少し!"
elsif score >= 70 then
puts "合格"
else puts "不合格" end

動画のようにrubyコマンドでプログラムを実行してみましょう。

elsifの注意点1

実行すると、「不合格、もう少し!」と出力されてしまいます。

本来でしたらscoreが90なので「合格」と出力されて欲しいところですが、scoreは60以上でもあるので、最初のscore >= 60が成り立つと判断されます。

elsifの注意点2

この場合はscore >= 60ではなく、score >= 70の方を最初に処理される条件式1として記述する必要があります。

このようにelsifを使う場合は、条件式を記述する順番に気をつけましょう。

ポイント
  1. 複数条件を指定する場合は、elsifを使う
  2. elsifは、必要な数だけ使うことができる
  3. elsifを使う場合は、処理される順番を考慮しよう

条件式の評価について理解しよう

ここまでifの使い方について説明してきましたが、次は「条件式」の部分を詳しくみていきましょう。

ifの基本構文

条件式が評価(式を実行して値を得ること)されると、正しいか、正しくないかを示す値が返ります。この値は、条件式の評価結果です。

ifは条件式の評価結果によって、どの処理を実行するかが決まります。

ぴっかちゃん

条件が成り立つかどうかは、条件式の評価結果で判定されていたんだね

条件式の評価については、ifをより理解するために必要だよ!

ぴかわかさん

条件式の評価結果を確かめてみよう

以下のサンプルコードを使って、条件式の評価結果を確かめてみます。
scoreの値は、その都度変更するものとします。

サンプルコード
1
2
3
if score >= 70 then
  puts "合格"
end

条件式が評価されて「条件式は正しい」ことを示す値のtrueが返ると、puts "合格"が実行されます。「条件式は正しくない」ことを示す値のfalseが返ると、ifの実行は終了します。

それでは、実際にtruefalseという値が返るのかを確かめよう

ぴかわかさん

正しいを示す値(true)の場合

まずは、正しいを示す値(true)を返す条件式を実行してみます。

以下の例では、条件式がscore >= 70scoreは90なので「条件式は正しい」と判定されます。

例

上記の条件式の部分をirbで実行してみます。
動画のようにscore90を代入した後、score >= 70を実行してみましょう。

条件式を実行するとtrueが返る

score >= 70を実行すると、trueという値が返ります。

このことから、条件式が正しいと判定される(条件が成り立つ)と、trueという値が返ることがわかりますね。

条件が成り立つ場合

以下の画像のように、条件式の部分はtrueに置き換わります。
条件式の部分がtrueであれば、then以下の処理が実行されます。

条件式はtrueに置き換わる

そのため、条件式の部分をtrueに置き換えても、「合格」と出力されます。

sample.rb | 条件式をtrueに置き換えた場合
1
2
3
if true then
puts "合格" end

動画のように上記をsample.rbに記述して、rubyコマンドで実行してみましょう。

条件式の部分をtrueに置き換えて実行

条件式の部分をtrueに置き換えて実行しても、then以下の処理が実行されますね。

ぴっかちゃん

ifは「条件式」がtrueであれば、処理が実行されるってことだね

あとで説明するけど、正しいを示す値は、true以外にもあるからね

ぴかわかさん

正しくないを示す値(false)の場合

次に、正しくないを示す値(false)を返す条件式を実行してみます。

以下の例では、条件式がscore >= 70、scoreは60なので「条件式は正しくない」と判定されます。

条件式が成り立たないとき

上記の条件式の部分をirbで実行してみます。
動画のようにscore60を代入した後、score >= 70を実行してみましょう。

条件式が成り立たないときfalseを返す

score >= 70を実行すると、falseという値が返ります。

このことから、条件式が正しくないと判定される(条件が成り立たない)と、falseが返ることがわかりますね。

条件が成り立たない

以下の画像のように、条件式の部分はfalseに置き換わります。
条件式の部分がfalseであれば、処理は実行されず、ifの実行を終了します。

falseに置き換えられる

以下のように条件式の部分をfalseに置き換えても、処理は実行されません。

sample.rb | 条件式をfalseに置き換えた場合
1
2
3
if false then
puts "合格" end

動画のように上記をsample.rbに記述して、rubyコマンドで実行してみましょう。

falseであればthen以降の処理が実行されない

条件式の部分をfalseに置き換えると、処理は実行されずにifは終了します。

このようにifは、条件式が正しいを示す値(true)であれば処理を実行し、正しくないを示す値(false)であれば処理が実行されません。

ぴっかちゃん

「true」と「false」ってなんなんだろう。。。

「true」と「false」は真偽値と呼ばれる値だよ

ぴかわかさん

真偽値とは

真偽値とは簡単に説明すると「ある条件が正しい(真)か正しくない(偽)か示すための値」のことです。

Rubyでは偽になる値はnilfalseだけで、偽以外の値はすべて真になります。

rubyの真偽値

ifの条件式の判定

ifの条件式はtruefalseかではなく、正確には真偽値で判定されます。

Rubyでは、nilfalse以外は真になる値です。
以下のように10(真になる値)を条件式に指定すると、処理は実行されます。

ifの条件式に10を指定した場合
1
2
3
if 10 then
  puts "真です"
end

以下のようにnil(偽になる値)を条件式に指定すると、処理が実行されません。

ifの条件式に10を指定した場合
1
2
3
if nil then
  puts "真です"
end

条件式を10nilにして実行すると、以下のようになります。

ifと真偽値

このようにifは条件式の真偽値によって、処理の流れが変わります。

ポイント
  1. 真偽値とは、ある条件が正しい(真)か正しくない(偽)か示すための値のこと
  2. 偽になる値はnilfalseだけで、偽以外の値はすべて真になる
  3. ifは条件式の真偽値によって、処理の流れを変える

後置if(if修飾子)

Rubyのifは、以下のように文の後ろに置くことができます。

後置ifを使う場合
1
2
3
score = 90

puts "合格" if score >= 70

このような書き方を「後置if」や「if修飾子」と呼びます。

以下の元コードと比べると、後置ifを利用すれば3行を1行で書けています。
後置ifを利用する方が簡潔に書くことができますね。

サンプルコード
1
2
3
4
5
score = 90

if score >= 70 then
puts "合格"
end

とても便利なものですが、非常に長い文の後にifを追加すると、かえって読みづらいコードになってしまう可能性があります。

後置ifを使う場合
1
2
3
score = 90

puts "今回のテストは例年よりも非常に難しく設定されていましたが、あなたは合格しました。" if score >= 70

一番右までスクロールすることで、やっとif score >= 70という条件が読めます。
このような場合は、後置ifを使わない方が可読性が高くなります。

後置ifを使わない場合
1
2
3
4
5
score = 90

if score >= 70 then
puts "今回のテストは例年よりも非常に難しく設定されていましたが、あなたは合格しました。" end

Rubyの条件分岐

Rubyの条件分岐には、ifだけではなくunlesscaseがあります。

ifは条件式が「真」のときに処理を実行しましたが、unlessは「偽」のときに処理を実行します。

ifを使用する場合
1
2
3
4
if true then
  puts "真です"  #条件式が真のとき処理は実行される
end
#=> 真です
unlessを使用する場合
1
2
3
4
if false then
  puts "偽です"  #条件式が偽のとき処理は実行される
end
#=> 偽です

また、分岐が多くなる場合や比較するオブジェクトが1つだけの場合は、ifよりもcaseを使う方が可読性が上がります。

ifを使用する場合
1
2
3
4
5
6
7
8
9
10
11
subject = "Science"

if subject == "Mathematics" then
  puts 98
elsif subject == "Science" then
  puts 86
elsif subject == "Japanese" then
  puts 60
else
  puts "?"
end
caseを使用する場合
1
2
3
4
5
6
7
8
9
10
11
12
subject = "Science"

case subject
when "Mathematics" then
  puts 98
when "Science" then
  puts 86
when "Japanese" then
  puts 60
else
  puts "?"
end

unlesscaseの使い方については、以下の表のリンク先を参考にしてみてください。

条件分岐 説明 リンク
if 条件式の真偽値で処理が分岐される
(真の時にthen以下の式を評価)
unless 条件式の真偽値で処理が分岐される
(偽の時にthen以下の式を評価)
unlessの使い方
case 1つの式に対する一致判定によって処理が分岐される caseの使い方

この記事のまとめ

  • 条件分岐とは、プログラムの中である条件が成り立つかによって、次に実行する処理を変えること
  • Rubyの条件分岐には、if・unless・caseがある
  • ifは条件式の真偽値によって、処理を変えることができる

0

わかった!