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 オブジェクト when 値1 then 処理文1 # オブジェクトが値1の時に実行される when 値2 then 処理文2 # オブジェクトが値2の時に実行される when 値3 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です
参考書籍
初学者におすすめです。
ソフトバンククリエイティブ
売り上げランキング: 6,842
たのしいRubyを読んだあとに。コンパクトで要点よくまとめられてます。