【Ruby】条件分岐について (if, unless, case, 三項演算子)

スポンサーリンク

Rubyの条件分岐処理の使い方についてです。条件分岐を綺麗に書けないとネストが深かったり式が汚かったり目も当てられないですからね。then は一応記述してますが基本的に省略した方がいいかなと思います。

if文について

基本構文

if文の基本的な構文は次のようになります。then は省略可能です。条件式にはif (条件式)のように括弧を付けることも可能ですが基本省略します。

if 条件式 then
    処理文1  # 条件式の結果が真の時に実行される
else
    処理文2  # 条件式の結果が偽の時に実行される
end

elsif を使うと次のように複数の判定を追加することもできます。おもわず elseif と e を書いてしまいそうですね。シェルは elif だし紛らわしい…。

if 条件式1 then
    処理文1  # 条件式1の結果が真の時に実行される
elsif 条件式2 then
    処理文2  # 条件式1の結果が偽で、条件式2の結果が真の時に実行される
else
    処理文3  # 条件式1と条件式2の結果が偽の時に実行される
end

if文の使い方

Rubyの条件判断に使える値は次のようになってます。

結果 条件
true と nil 以外のオブジェクト全て
false と nil

Javaのif文は結果がboolean値(true / false)になる条件式でなければいけませんが、Rubyの場合は nil か nil以外かでも条件判断を行えます。実際に試してみます。まずは通常の比較演算子で true か false を判断する条件式です。

num = 10
if num < 10 then
    puts "10より小さい"
else
    puts "10以上"
end
#=>10以上

次に nil か nil以外 を返すメソッドを条件式に使用してみます。String.try_comvertメソッドは引数に渡した値をStringに変換して返しますが、出来なかった場合は nil を返すメソッドです。

if String.try_convert("hoge") then
    puts "Stringに変換できました。"
else
    puts "Stringに変換できませんでした。"
end
#=>Stringに変換できました。

if String.try_convert(1234) then
    puts "Stringに変換できました。"
else
    puts "Stringに変換できませんでした。"
end
#=>Stringに変換できませんでした。

このようにtrue か false 以外でも条件判断はできます。

ちなみに1234は to_s メソッドを使えばStringに変換できますが、String.try_convertメソッドでは to_str メソッドを使っているためエラーになります。to_str は変換といってもかなり厳しいものらしく正直まだよくわかってないです。とりあえず String.try_convert は渡した文字列がStringかどうか判定してくれるという感じで覚えておいてもいいかも。

if文の条件が複数行になる場合

条件が多くて複数行になってしまう場合ですが、Rubyは改行を式の区切りとして認識してしまいます。なので、不用意に改行するとエラーになってしまうので次のようにします。

・&&(and)演算子や ||(or)演算子は改行の前に記述する。

基本的に長くなる場合は複数の条件を&&などで繋げてく場合だと思いますので、改行の前に記述するようにします。こうすることで式の途中だと自動で認識してくれます。

if 10 < num &&
   num < 100
...
end

・バックスラッシュを記述する

改行時にバックスラッシュをいれることで式の途中だと明示的に表します。これはif文以外でも使えますので覚えておくといいでしょう。

if 10 < num \
   && num < 100
...
end

戻り値

if文では最後に評価した結果を返します。

unless文について

unless文の基本的な構文は次のようになります。then は省略可能です。

unless 条件式 then
    処理文1  # 条件式の結果が偽の時に実行される
else
    処理文2  # 条件式の結果が真の時に実行される
end

if文との違いは条件式の結果判定が逆になっていて、偽が then で真が else になります。unless文に elsif はありません。というよりunless文で else を使うくらいならif文を使いましょう。

条件式に否定の!はなるべく使用しない方がいいため、if文と使い分けます。

if修飾子とunless修飾子

if と unless は実行したい処理の後ろに書くことができます。else が必要なく1行で記述できる場合に適しています。

p "10未満" if num < 10
p "10以上" unless num < 10

条件演算子(三項演算子)

if文は以下のように記述することもできます。

条件式 ? 真の時の値 : 偽の時の値

シンプルに使いたい時は便利ですね。if / then / else が1行で書けるようなif文の場合に使用します。

msg = num < 10 ? "10未満" : "10以上";

ちなみに使いどころは選びますが||演算子を使用して三項演算子の代わりにすることもできます。||演算子は左辺の結果が真(true と nil 以外)であった場合にはその値を返し、左辺の評価結果が偽(false と nil)であった場合には右辺の評価結果を返すものですね。以下の例ではハッシュから:remonのキーを参照していますが存在しないので nil となり、右辺のnot foundが返っています。

fruits = {apple: "アップル", orange: "オレンジ", grape: "グレープ"}
p fruits[:remon] || "not found"
#=>"not found"

case文について

あるオブジェクトの状態によって処理を変えたい場合によく使います。比較演算子( <、>、!= )や、true、falseで判定したい場合はif文の方が適しています。

基本構文

case文の基本的な構文は次のようになります。then は省略可能です。

case オブジェクト
when1 then
    処理文1  # オブジェクトが値1の時に実行される
when2 then
    処理文2  # オブジェクトが値2の時に実行される
when3 then
    処理文3  # オブジェクトが値3の時に実行される
else
    処理文4  # オブジェクトが値1〜値3以外の時に実行される
end

whenに複数の値を指定したい場合はカンマで区切って記述します。

when 値1, 値2, 値3

配列をwhenに指定したい場合は * を要素の前に付ければ展開されます。

nums = [1, 2, 3]
case hoge
when *nums  # when 1,2,3となる
...
end

case文は判定の際に「===」という演算子を使っています。これにより厳密に値を比較するというよりも、幅を持たせた判定をしれくれます。case文をif文に書き換えるとwhenで指定した値は「===」演算子の左辺です。

p(/cd/ === "abcdef")  #=>true
p(String === "abcdef")  #=>true
p((1..3) === 2)  #=>true

case文に条件式を指定する

case文では オブジェクト<=>値 の組み合わせだけでなく 条件式<=>条件式 による記述もできます。その場合は 条件式の結果と条件式の結果を === 演算子を用いて評価します。

case 1 + 10
when 5 + 4 then 処理文
when 5 + 5 then 処理文
when 5 + 6 then 処理文  # 実行される
end

caseの条件式を省略した場合は、結果が偽でない最初のwhenに該当します。if文みたいな使い方もできますね。

hoge = 100
case
when hoge == 10 then 処理文
when hoge == 100 then 処理文  # 実行される
when hoge == 1000 then 処理文
end

戻り値

case文は最後に評価した結果を返してくれます。つまり次のような使い方です。

hoge = 100
result = case hoge
when 10 then "10です"
when 100 then "100です"
when 1000 then "1000です"
end
puts result
#=>100です 

参考書籍

初学者におすすめです。

たのしいRuby 第4版
たのしいRuby 第4版
posted with amazlet at 15.05.22
高橋 征義 後藤 裕蔵
ソフトバンククリエイティブ
売り上げランキング: 6,842

たのしいRubyを読んだあとに。コンパクトで要点よくまとめられてます。

初めてのRuby
初めてのRuby
posted with amazlet at 15.05.22
Yugui
オライリージャパン
売り上げランキング: 16,113