Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

他のプログラム言語のif構文の中で使われるelse ifをRubyで使う場合、elsifが用いられます。これは、「ぶら下がりelse問題」によるもので、Rubyの特徴の1つです。ただし、Rubyではelsifが使えるから大丈夫、ということではありません。

今回は、else ifによる「ぶら下がりelse問題」と、Rubyにおけるif構文を使う際の注意点について解説します。

Rubyのぶら下がりelse問題

「ぶら下がりelse問題」をご存じでしょうか。C言語やJavaなどのプログラミング言語を学んだ方は、if構文を{}で囲うので、入れ子になったif文が記述できます。しかし、Rubyには{}が無いので、2つ目以降の条件か、それとも、入れ子の条件かを明確に区別しなければなりません。

そのため、Rubyのif構文は、C言語やJavaなどの他のプログラム言語のif構文と違っています。まずは、Rubyにも関係が深い、ぶら下がりelse問題について説明します。

入れ子のelse ifとは

例えば、下記のC言語のif構文を見てください。条件1のelse構文の中に、さらにif構文を記述しています。C言語は、if構文を{}の中に記述しているので、入れ子のif文の構文は、明確に区別されます。

C言語のif構文

  1. if( 条件1 ) {
  2. 処理1;
  3. } else if( 条件2 ) {
  4. 処理2:
  5. }else {
  6. if( 条件3-1 ) {
  7. 処理3-1;
  8. } else {
  9. 処理3-2;
  10. }
  11. }

この処理をrubyで記述する場合、C言語のような{}が無いので次のように記述します。
Rubyのif構文

  1. if 条件1 then
  2. 処理1
  3. elsif 条件2 then
  4. 処理2
  5. else
  6. if 条件3 then
  7. 処理3-1
  8. else
  9. 処理3-2
  10. end
  11. end

もし、C言語の「else if (条件2)」をrubyでも書けたら、どうなるでしょうか。入れ子でない「else if 条件2」と、入れ子の「else if 条件3」が同じ書き方になってしまい、Rubyのプログラムは入れ子の判断ができません。

これは、Rubyにおける「ぶら下がりelse問題」、または、「ダングリングelse」と呼ばれています。

Rubyにはelsifとelse ifがある

先ほど説明したように、Rubyのif構文では、「ぶら下がりelse問題」があるので、複数の条件を使ってif構文を使う場合は、elsifを使用します。
elsifの構文

  1. if 条件1 then
  2. 処理1
  3. elsif 条件2 then
  4. 処理2
  5. else
  6. 処理3
  7. end

また、if構文が入れ子になっている場合は、else ifが使われているように見えます。
入れ子のif構文

  1. if 条件1 then
  2. 処理1
  3. else
  4. if 条件2-1 then
  5. 処理2-1
  6. else
  7. 処理2-2
  8. end
  9. end

「ぶら下がりelse問題」は他の言語でも

Rubyの特徴は、記述量が少なく、ソースコードの可読性に優れ、保守性の高いプログラムを作れることです。しかし、ぶら下がりelse問題のように、記述量が少ないせいで問題になることもあります。

では、他のプログラム言語でも、「ぶら下がりelse問題」があるのでしょうか。例えば{}で囲うのでC言語やJava、PHPではもちろんありません。さらに、字下げするPythonでも無関係です。

しかし、PHPやVisual Basicではelseifを使います。また、PerlでもRubyと同じelsifが使えるます。このように「ぶら下がりelse問題」でRubyだけでの問題ではありません。

Rubyではifでelseとelsifが使える

先ほど解説したように、Rubyには「ぶら下がりelse問題」があり、if構文でelseとelsifを使い分けます。そして、その違いを確認できる例が次のとおりです。

2つ目以降の条件はelsif

Rubyのif構文で、2つ目以降の条件を設定する場合は、elsifを使います。

if構文の文法

  1. if 条件1 then
  2. 処理1
  3. elsif 条件2
  4. 処理2
  5. end

if構文の例

  1. chk=1
  2. if age = 65 then
  3. chk=3
  4. end

上記の例は、変数ageの値が18より小さい場合、と、変数ageの値が65以上の場合で、別の処理を実行しています。そして、2つ目の条件に、elsifを使います。

条件に該当しない場合はelseで

Rubyのif構文で、条件に該当しないケースの処理を記述するは、elsifを使います。

if構文の文法

  1. if 条件 then
  2. 処理1
  3. else
  4. 処理2
  5. end

if構文を使った例(入れ子なし)

  1. if chk == 1 then
  2. checker = "OK"
  3. else
  4. checker = "NG"
  5. end

先ほど説明したように、Rubyのif構文を入れ子で記述できます。そのため、次のようなif構文も書けます。

if構文を使った例(入れ子あり)

  1. if chk == 1 then
  2. checker = "OK"
  3. else
  4. if sw == 1 then
  5. checker = "NOTICE"
  6. else
  7. checker = "NG"
  8. end
  9. end

この例は、if構文のelseの下に、入れ子でif構文を記述した例です。

なお、下記のように1行で記述しても、正常に動作します。しかし、「else if」は他のプログラム言語と意味が違い、入れ子のif構文になっているので注意してください。

  1. if chk==1 then checker="OK" else if sw==1 then checker="NOTICE" else checker = "NG" end end

Rubyのぶら下がりelse問題を回避するには

これまで紹介したように、C言語のelse ifに相当するRubyの構文はelsifです。そして、Rubyでもelse ifと書くことは可能ですが、それは、elseの下に入れ子でif構文を書いたケースで意味が違います。

紛らわしいelse ifの書き方を避ける方法を使うように心がけましょう。次から、Rubyのぶら下がりelse問題を回避する方法について説明します。

if修飾子で置き換える

Rubyでは、C言語やJavaよりも、短く読み易いプログラムを書ける点が特徴で、プログラムを簡潔に記述する方法が幾つもあります。もし、簡単なif構文であれば、if修飾子の記述を検討してください。なお、if修飾子とは、条件に一致する場合のみ、式を実行するための修飾子です。

if修飾子の文法

式 if 式

if修飾子を用いた例

  1. if chk == 1 then
  2. checker = "OK"
  3. else
  4. checker = "NG"
  5. checker = "NOTICE" if sw == 1
  6. end

これは、先ほどの入れ子のif構文を、if修飾子で書き換えた例です。入れ子のif構文が簡単な処理であれば、シンプルに記述できます。

条件演算子を活用する

Rubyには、先ほど紹介したif修飾子に似た機能として、三項演算子を使用できます。なお、条件演算子は三項演算子とも言いますが、変数に代入する際、条件に該当する場合の値と、該当しない場合の値を指定できる演算子です。

条件演算子の文法

条件 ? 該当する場合の値 : 該当しない場合の値

条件演算子は、下記のif文と同じ機能を提供します。

if 条件 then 該当する場合の値の代入 else 該当しない場合の値の代入 end

条件演算子の例

  1. checker = sw == 1 ? "NOTICE" : "NG"

この例は、変数swの値をチェックし、もし1なら”NOTICE”を、1でなければ”NG”を、checkerに代入する条件演算子を使った式です。

そして、if構文に条件演算子を組み合わせると、先ほどの例を次のように記述できます。

条件演算子を用いた例

  1. if chk == 1 then
  2. checker = "OK"
  3. else
  4. checker = sw == 1 ? "NOTICE" : "NG"
  5. end

メソッドに分ける

先ほど説明したように、Rubyの簡単なif構文は、if修飾子や条件演算子で置き換えることで、短く読み易いプログラムが書けます。しかし、入れ子のif構文が、このように簡単なif構文とは限りません。

もし、複雑なif構文の入れ子の構造を見直したいなら、メソッドに分ける方法を活用してください。

if構文をメソッドで分けた例

  1. def ng_case(sw)
  2. if sw == 1 then
  3. return("NOTICE")
  4. else
  5. return("NG")
  6. end
  7. end
  8. if chk == 1 then
  9. checker = "OK"
  10. else
  11. checker = ng_case(sw)
  12. end

まとめ

これまで説明したように、Rubyのif構文には、elsifとelseがあり、使う場所が違います。そして、他のプログラム言語で使えるelse ifは、Rubyでは使えないので注意してください。

そして、Rubyでif構文を入れ子にすると、ぶら下がりelse問題に直面します。if構文の入れ子を使ったプログラムを避けてください。

Rubyでは、if修飾子や条件演算子を使えばif構文と同じように書けます。さらに、メソッドを分けると、より見やすく書けるので、これらをうまく活用してください。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。