質問: ### 前提・実現したいこと Rubyにおけるif文の認識をしっかりさせたい。 ### 質問内容 Ruby初級レベルの者です。 プロを目指す人のためのRuby入門(俗に言うチェリー本)において、 「Rubyのif文は最後に評価された式を戻り値として返す」との記載について質問です。 このことを念頭において、FizzBuzzメソッド(後述)を作成してみましたが、違いました。 原因はif文の認識の違いにあるようです。 以下のコードにおいて、 n%15==0が**最後に評価される**ならば、n=15の時、FIzzBuzzが出力されるものだと思っておりましたが、 実際には先にn%3==0が真になってしまいます。 これは「Rubyのif文は最後に評価された式を戻り値として返す」に矛盾しませんか? ### 私のFizzBuzzメソッドのコード ``` def fizz_buzz(n) if n%3==0 'Fizz' elsif n%5==0 'Buzz' elsif n%15==0 'Fizz Buzz' else n.to_s end end puts fizz_buzz(15) #=>Fizz ``` ### 解答のFizzBuzzメソッドのコード ``` def fizz_buzz(n) if n%15==0 'Fizz Buzz' elsif n%3==0 'Fizz' elsif n%5==0 'Buzz' else n.to_s end end puts fizz_buzz(15) #=>Fizz Buzz ``` ### 試したこと Rubyのif文に関して調べてみました。 別のサイトで, 「条件式を上から順に評価していき真(true)となった時点でその後の条件式は評価されない」 との記述を発見しました。 FizzBuzzがうまくいかなかったので、この記述は正しいのでしょうが、 自分の認識ではif文の中の式を全て評価し、その評価した中で最後の真となった条件式の処理に分岐させるものだと考えておりましたが、さらに混乱した次第です。 ### 補足情報(FW/ツールのバージョンなど) ruby 2.6.3(私) ruby 2.4(該当書籍)
回答: > > n%15==0が最後に評価されるならば > > > 前提が間違っています。`elsif`は、それより手前で条件が成立した場合、**評価すらされません**。