3
0

More than 1 year has passed since last update.

Ruby特有のif文

Last updated at Posted at 2021-10-16

Rubyを勉強し始めて1日目
初心者として気になったこと・躓いたことを備忘録として残していこうと思います。

構文

if文
if 条件A
    # 条件Aが真だった場合の処理
elsif 条件B
    # 条件Bが真だった場合の処理
elsif 条件C
    # 条件Cが真だった場合の処理
else
    # どの条件に対しても真にならなかった場合の処理
end

複数条件の場合は、else ifではなくelsifです。

JavaScriptなどの言語から勉強している方は注意が必要です。(私も間違えやすい...)

便利な性質

戻り値を返す

Rubyのif文は戻り値を返すため、変数に戻り値を代入することができます。
以下は時間帯によって表示する挨拶を変更するコード例です。

戻り値を変数に代入する
time_zone = '夜'

greeting =
if time_zone == '朝'
    'おはよう'
elsif time_zone == '昼'
    'こんにちは'
elsif time_zone == '夜'
    'こんばんは'
else
    "???"
end
結果
puts greeting #=>'こんばんわ'

if修飾子

if修飾子として文の後ろにif文を置くことができます。
以下は成績が80点以上の場合、'合格'を表示するコード例です。

if修飾子
score = 100
puts '合格' if score >= 80
結果
#>='合格'

便利な性質も多いですがメソッドで使用するときは注意が必要です。
私が使用していてハマったことを書き残しておきます。

メソッドで使用する場合の注意点

if文

Rubyのif文は戻り値を返すという特性があるため、return文を書く必要はありません。
return文を書かないのであれば変数も必要ないと思い、以下のような成績が80点以上は、'合格'を返しそれ以外は'不合格'を返すコードを書きました。

if文
def exam(score)
    '不合格'
    if score >= 80
        '合格'
    end
end

scoreに50を渡した場合
条件は成り立たず最後に評価された式は、'不合格'となり戻り値として返されると考えました。
しかし結果は以下の通りになります。

結果
puts exam(50) #>=nil

'不合格'は返されずnilが返されます。
if文についての詳しい解説は公式リファレンスにあります。

if 式は、条件が成立した節(あるいは else 節)の最後に評価した式の結果を返します。
else 節がなくいずれの条件も成り立たなけれ ば nil を返します。
制御構造 - if(Ruby 3.0.0)

このように思わぬところでバグを生む要因になることがあるため注意が必要です。
正しく書く場合は、次のように書くことができます。

if文
def exam(score)
    if score >= 80
        '合格'
    else
        '不合格'
    end
end

if修飾子

偽になる時の戻り値はnilです。

右辺の条件が成立する時に、左辺の式を評価してその結果を返します。条件が成立しなければ nil を返します。
制御構造 - if 修飾子(Ruby 3.0.0)

そのため以下のようなコードを書くときは注意してください。

if修飾子
def exam(score)
    '不合格'
    '合格' if score >= 80
end
結果
puts exam(50) #>=nil

こちらも不合格は返されずnilが返されます。
正しく書く場合は、次のように書くことができます。

if修飾子
def exam(score)
    return '合格' if score >= 80
    '不合格'
end

最後に

最後まで読んでいただきありがとうございました。
LGTMやコメントいただけると励みになります。
ここ間違ってるよといったような指摘コメントも歓迎していますXD
よろしければフォローもお願いします!

3
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0