Ruby入門7: 条件分岐

Ruby入門
CANIT先生
CANIT先生

今回はRubyの条件分岐を学んでいきましょう

猫田さん
猫田さん

条件分岐……。 まーた、知らない言葉が出てきたぞ

牛山くん
牛山くん

キャニット先生! 条件分岐ってなんですか?

CANIT先生
CANIT先生

まずはそこからですよね。わかりました。最初に条件分岐を解説しましょう

条件分岐って何?

パソコン
CANIT先生
CANIT先生

ゲームをやっているとバトルシーンに出くわすことがあると思います。『モンスターが現れた!』なんてやつですね

牛山くん
牛山くん

RPGとかによくありますね

CANIT先生
CANIT先生

そんなときに『戦いますか?』と、問われるとその後の行動をこちらで選択できると思いますが……それが条件分岐です

猫田さん
猫田さん

なるほど。わたしは、すでに条件分岐マスターだったのか

条件分岐はあちこちで使われている

ユーザー側の選択によってその後のストーリーが変わるのは、コンピューターが条件分岐の処理を行っているからです。

また、ネット通販などでも『ポイントを使いますか?』と問われることがあるでしょう。ポイントを使った分だけ安くお買い物ができる。そんなケースです。

あれも、ポイントを使う・使わないで値段が変わる条件分岐によって管理をされています。

ちなみに、条件分岐は(if文)と呼ばれています。

牛山くん
牛山くん

『もし、戦うなら〜』とか『もし、ポイントを使うなら〜』の『もし』のifですね

条件分岐に使うif文

ゲーム
CANIT先生
CANIT先生

ゲーム内で『戦う・戦わない』を選択する場面を例にして、Rubyで書いてみましょう

fight = “はい”

if fight == “はい” then
puts “戦います。”
end

puts “次に行きます。”

牛山くん
牛山くん

このプログラムは、どんな意味ですか?

このプログラムの中心的な部分は、if, then, endです。ifからthenまでの間、この場合は

fight == “はい”

の部分が正しければ、endまでの間を実行します。

== を覚えておこう

CANIT先生
CANIT先生

==というのが初めて出てきましたね。これは、文字列が一致するという意味です

以前の講義で「=」は、代入を意味すると学んでいますね。「=」で代入された「はい」が「==」の文字列とも一致したので、thenとendの間の、

puts “戦います。”

が実行されます。

putsの前に一行の空白がありますが、実はここにtabが入っています。

thenとendの間は先頭にtabを入れて、プログラムを見やすくしています。

tabを入れなくても動きますが、慣習的に入れることになっています

ちなみに、”戦います。”の実行が終わると、endの次の、

puts “次に行きます。”

が実行されます。

文字列が一致しないときは?

牛山くん
牛山くん

戦わないときは、どうなるんですか?

では、fightの値を変えてみましょう。

fight = “いいえ”

if fight == “はい” then
puts “戦います。”
end

puts “次に行きます。”

fightの値を”いいえ”に変えてみました。今度は、ifとthenの間の、

fight == “はい”

が正しくないので、thenとendの間は実行されずに、

puts “次に行きます。”

だけが実行されます。

猫田さん
猫田さん

「はい」という文字列が一致しないと戦わないのか。なるほどねー ほとんどのゲームに使われていそうだね

真理値(true, false, nil)

CANIT先生
CANIT先生

ifとthenの間を、正式には条件式と言います。この条件式をもう少し詳しく説明しましょうか

先ほどは「正しい」「正しくない」と表現しましたが、正式にはtrue(真)false(偽)といいます。ここは重要なので、正確性を考えてRubyの公式ドキュメントから引用します。

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

前述の例だと、

fight == “はい”

の「結果」が真か偽かが問題になります。

fight == “はい”

の条件下で、

fight == “はい”

はtrueです。逆に

fight == “いいえ”

はfalseです。

逆に、

fight == “いいえ”

の条件下で、

fight == “はい”

はfalseです。

fight == “いいえ”

はtrueです。混乱しがちなので、気を付けてください。

関係演算子

パソコン

真か偽かを判定する方法に、関係演算子というものがあります。

以前の講義で加減乗除のような演算子が出てきましたが、演算子は計算をするものです。

関係演算子は、真か偽かを判定するのに使われる演算子です。

「==」以外の関係演算子

「==」以外にも、関係演算子には、!= 等しくない、>, >=, <, <=があります。

!=は左辺と右辺が等しくないと全体が真になる関係演算子です。

不等号が入っているものは大きさを比較して、結果が真か偽かを判定する関係演算子です。

具体例として、レベルが5以上だと戦うプログラムを例として挙げておきます。>=を例として挙げておきましたが、==,!=,>,<,<=に変えて試してみてください。

論理演算子

二つ以上の条件をクリアしていないと、全体として真にできない時があります。たとえば自分のレベルが5以上で、「戦う」を選択しないと戦闘が始まらない。そんなプログラムを組むことも可能です。

こういうときは条件式に、

if level >= 5 && fight == “はい”

と書きます。

&&(論理積,and)は、前の条件式と後の条件式が同時に真の場合だけ、thenとendの間が実行されます。

猫田さん
猫田さん

なんか……だんだん複雑になってきた

CANIT先生
CANIT先生

ちょっとずつ複雑になっていますよ。たしかに、言葉だけだとわかりづらいかもしれませんね。わかりやすいように、実際にプログラムを書いてみましょうか

猫田さん
猫田さん

ふむふむ。このプレイヤーはレベル7だから「レベル5以上」をクリアしていますね。その上で、「はい」を選択したから戦いが始まると……。なんとなくわかりましたよー

論理演算子 &&の仲間達

行動

&&の仲間には、||(論理和, or)と!(否定, not)があります。

「||」は、前の条件式と後の条件式のどちらか一方以上が真であるときにthenとendの間を実行します。

「!」は条件式が真の時に偽の結果を返し、偽の時に真の結果を返します。つまり、真偽値をひっくり返す論理演算子です。

演算子の優先順位

CANIT先生
CANIT先生

演算子、関係演算子、論理演算子には、優先順位があるんですよ

算数で、

3 + 4 * 5

は4 * 5が最初に計算され、3 + 4を先に計算したいときには、

(3 + 4) * 5

と書くと習ったと思います。

Rubyの、演算子、関係演算子、論理演算子にもあらかじめ決まっている順番があります。もちろん順番を変えることは可能で、その場合はカッコを使うことになります。優先順位を表にしておきます。
牛山くん
牛山くん

けっこう、たくさんの種類があるんですね

猫田さん
猫田さん

絶対に覚えられない自信があります

CANIT先生
CANIT先生

全部を覚える必要はありませんよ。 ただ、プログラムを組んで意図とは違う結果が出たら、優先順位をチェックすると良いでしょう。今は「演算子には優先順位がある」とだけ覚えておけば良いです

else文

CSS
CANIT先生
CANIT先生

続いては、else文を学んでいきましょう

前述のゲーム内でのシチュエーションでは、「戦いますか?」の問いに「いいえ」と答えたら、何もしませんでした。

でも、戦い以外の何かをするように設定することももちろんできます。

このように、戦うときと戦わないときで動作を変える時に使うのがelse文です。

if文の中の条件式が真なので、thenとelseの間だけが実行されます。elseとendの間は実行されません。

fightが”いいえ”の場合は、逆にthenとelseの間は実行されずに、elseとendの間だけが実行されます。

elsif文

女性

「戦う」「話しかける」「逃げる」などの複数の選択肢のうちの一つを選ぶときに使うのがelsif文です。

牛山くん
牛山くん

「else」と「if」を合体させたんだから、「elseif」ではないのですか?

CANIT先生
CANIT先生

それが違うんですよ。「elsif」としっかり覚えておいてくださいね

例として挙げるプログラムの”戦う”の部分を”話しかける”や”逃げる”に書き換えて、elsifの動作を確かめてみましょう。

case文

elsifはcase文を用いて同じように書けます。

caseの直後に分岐のために使う変数を書くだけです。これも”戦う”のところを”話しかける”や”逃げる”に書き換えて、case文の動作を確かめてください。

elsifを重ねるよりもcase文を使った方がスッキリかけます。

他にも条件分岐はいろいろと……

条件分岐には上記の他にも、いろいろあります。

  1. 条件式の中の真偽値をひっくり返す、unless文
  2. case文でwhenとthenの間に複数の項目を書ける機能
  3. if, elseの対と同じ機能を果たす、?,:
  4. if文の後置型
CANIT先生
CANIT先生

ただ、専門的になりすぎるのでここでは項目だけ挙げておきますね

猫田さん
猫田さん

そうそう。ほどほどにしておきましょう

まとめ

パソコン
CANIT先生
CANIT先生

では、今回の講義はこのへんにしておきましょうか

牛山くん
牛山くん

今回も内容が濃かったですね

猫田さん
猫田さん

Rubyマスターにどんどん近づいている気がします。よーし、この調子で次に行ってみよー

挫折率が高い??プログラミング学習のポイント
駆け出しエンジニアが一緒に学ぶ
CANITは、Progateやドットインストールで独学している人達同士をつなげます。駆け出しエンジニアのあなたのためのSNSです。
Ruby入門
【この記事を書いた人】
CANIT 先生

あらゆるプログラミング言語をあやつるフリーの凄腕講師。温和な性格で「わかるまで教えます」がモットー。たまに時間ができると動物の仲間達に、プログラミングを教えることもある。現在の生徒は牛山くんと猫田さん。

CANIT
タイトルとURLをコピーしました