質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Q&A

解決済

2回答

1308閲覧

Rubyのif文は「最後に評価された式を戻り値として返す」とは。

nakasho

総合スコア11

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

0グッド

0クリップ

投稿2020/07/08 01:06

前提・実現したいこと

Rubyにおけるif文の認識をしっかりさせたい。

質問内容

Ruby初級レベルの者です。

プロを目指す人のためのRuby入門(俗に言うチェリー本)において、
「Rubyのif文は最後に評価された式を戻り値として返す」との記載について質問です。
このことを念頭において、FizzBuzzメソッド(後述)を作成してみましたが、違いました。
原因はif文の認識の違いにあるようです。

以下のコードにおいて、
n%15==0が最後に評価されるならば、n=15の時、FIzzBuzzが出力されるものだと思っておりましたが、
実際には先にn%3==0が真になってしまいます。
これは「Rubyのif文は最後に評価された式を戻り値として返す」に矛盾しませんか?

私のFizzBuzzメソッドのコード

ruby

1def fizz_buzz(n) 2 if n%3==0 3 'Fizz' 4 elsif n%5==0 5 'Buzz' 6 elsif n%15==0 7 'Fizz Buzz' 8 else 9 n.to_s 10 end 11end 12 13puts fizz_buzz(15) #=>Fizz

解答のFizzBuzzメソッドのコード

ruby

1def fizz_buzz(n) 2 if n%15==0 3 'Fizz Buzz' 4 elsif n%3==0 5 'Fizz' 6 elsif n%5==0 7 'Buzz' 8 else 9 n.to_s 10 end 11end 12 13puts fizz_buzz(15) #=>Fizz Buzz

試したこと

Rubyのif文に関して調べてみました。
別のサイトで,
「条件式を上から順に評価していき真(true)となった時点でその後の条件式は評価されない」
との記述を発見しました。
FizzBuzzがうまくいかなかったので、この記述は正しいのでしょうが、
自分の認識ではif文の中の式を全て評価し、その評価した中で最後の真となった条件式の処理に分岐させるものだと考えておりましたが、さらに混乱した次第です。

補足情報(FW/ツールのバージョンなど)

ruby 2.6.3(私)

ruby 2.4(該当書籍)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ruby

1def fizz_buzz(n) 2 if n%3==0 3 'Fizz' 4 elsif n%5==0 5 'Buzz' 6 elsif n%15==0 7 'Fizz Buzz' 8 else 9 n.to_s 10 end 11end 12 13puts fizz_buzz(15) #=>Fizz

「条件式を上から順に評価していき真(true)となった時点でその後の条件式は評価されない」
なので、一番最初に真になるn%3==0のブロックに入ります。

このブロックの中には単に'Fizz'と書かれた式があります。
'Fizz'を評価するとそのまま'Fizz'で、
「Rubyのif文は最後に評価された式を戻り値として返す」(正確にはifは文ではなく式です)
ので、'Fizz'が返ります。

投稿2020/07/08 01:21

編集2020/07/08 01:24
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakasho

2020/07/08 01:54

ご回答ありがとうございます. if 条件A #条件Aが真だった場合の処理 elsif 条件B #条件Bが真だった場合の処理 ではなく、 if 条件A #条件Aが真だった場合の処理 elsif 条件B #条件Aが偽で条件Bが真だった場合の処理 なんですね。
guest

0

ベストアンサー

n%15==0が最後に評価されるならば

前提が間違っています。elsifは、それより手前で条件が成立した場合、評価すらされません

投稿2020/07/08 01:10

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/07/08 01:10

> 自分の認識ではif文の中の式を全て評価し、その評価した中で最後の真となった条件式の処理に分岐させるものだと考えておりましたが 認識が誤りです。
nakasho

2020/07/08 01:47

早速のお返事ありがとうございます。 elsifについての認識を改めます。 ちなみに「最後に評価された」とは評価される式が複数ある場合もあるということでしょうか?
maisumakun

2020/07/08 01:49

> 評価される式が複数ある場合もあるということでしょうか? はい、ifの1つの条件の中に2行以上書いてあった場合、各行が順次評価されます。
nakasho

2020/07/08 02:01

なにか簡単な例をあげてもらうことは可能でしょうか?
ozwk

2020/07/08 02:02

if n%15==0 'hoge' 'Fizz Buzz' elsif n%3==0 ...
maisumakun

2020/07/08 02:02

def fizz_buzz(n) if n%3==0 puts 'hoge' 'Fizz' else n.to_s end end このようにした場合、n%3==0では「puts 'hoge'」のあとに「 'Fizz'」が評価されます。
nakasho

2020/07/08 06:48

なるほどですね。。 「最後に評価された」というのはこういうことだったのですね。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問