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

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

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

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

Q&A

解決済

2回答

900閲覧

def中のif中elseのあとで処理するのと、ifのendのあとで処理するのとで違いはありますか?

mosutoboi

総合スコア11

Ruby

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

0グッド

1クリップ

投稿2019/06/17 11:05

前提・実現したいこと

Progeteで勉強している初学者です。
def中のif中elseのあとで処理するのと、ifのendのあとで処理するのとで違いはありますか?

ググった結果、違いはないけど、if-elseで処理しないほうがいいよ~
ってくらいに感じだたのですが、間違っていないでしょうか?

発生している問題・エラーメッセージ

def price_with_shipping(price) # priceが5000以上のとき、戻り値としてpriceを返すif文を作成してください if price >= 5000 return price end # priceに500を加えた値を戻り値として返してください return price + 500 end puts "商品の合計金額は3000円です" puts "お支払い金額は、送料込みで#{price_with_shipping(3000)}円です" puts "-----------" puts "商品の合計金額は10000円です" puts "お支払い金額は、送料込みで#{price_with_shipping(10000)}円です"

該当のソースコード

ソースコード

試したこと

ruby def の中にif else

でググって↓のページに辿り着きました。
https://qiita.com/katoy/items/bd243d62375bc74247b9

if - else を使わなくても可能で、if - else を使った分岐では破綻しやすい。
と記載がありました。

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

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

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

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

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

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

guest

回答2

0

処理結果に違いは無いので、あとは文面としての意味だけです。
どちらの方が、ロジックを自然に表現しているかで、今回の例に限って言うとpriceの値での二分岐なので、else句に書いた方が良いかと思います。
つまり、

Ruby

1def price_with_shipping(price) 2 return price if price >= 5000 3 price + 500 4end

より、

Ruby

1def price_with_shipping(price) 2 if price >= 5000 3 price 4 else 5 price + 500 6 end 7end

Ruby

1def price_with_shipping(price) 2 price >= 5000 ? price : price + 500 3end

の方が良いと思います。if price >= 5000という条件判断が、このメソッドの中心だからです。
この例に限らない一般論としては、早期リターンも有効です。

また、多分岐なら、caseで書けないかを検討します。
将来的に多分岐になる可能性が高いなら、二分岐の時からcaseを使います。

Ruby

1# Ruby 2.6以降 2def price_with_shipping(price) 3 case price 4 when (5000..) 5 price 6 when (1000..) 7 price + 300 8 else 9 price + 500 10 end 11end 12# Ruby 2.5以前の場合は範囲の終端を指定して下さい

投稿2019/06/17 13:00

otn

総合スコア84505

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

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

mosutoboi

2019/06/19 01:27

ありがとうございました。
guest

0

ベストアンサー

ロジック的観点よりも、リーダブルなコード的観点で早めにReturnしてメソッドから抜けよう!ってことがよく言われます(参考)。

例えば今回上げていらっしゃるコードで言うと、

  1. elseを書かずにifがTrueの時に、Returnをしてしまえば、早くメソッドから抜けられます。
  2. Rubyだと最後の行を返り値として返すのであれば、あえてReturnを書く必要はありません。
  3. 後置Ifを使えば1行でIf文を書くことができます。長いコードではないので、ここは1行でいいかもです。

Ruby

1def price_with_shipping(price) 2 # priceが5000以上のとき、戻り値としてpriceを返すif文を作成してください 3 return price if price >= 5000 4 # priceに500を加えた値を戻り値として返してください 5 price + 500 6end 7

また三項演算子を使って以下のように1行で書くこともできます。
ifの中のコードが今回のように短い場合は、コードがスッキリするのでおすすです!

def price_with_shipping(price) price >= 5000 ? price : price + 500 end

投稿2019/06/17 12:10

hatsu

総合スコア1809

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

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

mosutoboi

2019/06/19 01:27

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問