回答編集履歴

1

追記…

2015/11/16 12:29

投稿

raccy
raccy

スコア21733

test CHANGED
@@ -2,8 +2,22 @@
2
2
 
3
3
 
4
4
 
5
- もうちょっと、細かく説明していきます。`return days`が無かった場合を考えます。一番最後の式は、`if month == 2`から始まってそれに対応する`end`です。つまり、メソッドの返り値としてこの式の値が返されます。では中身を見ると、もし、monthが2の場合は`if year % 4 == 0`から始まってそれに対応する`end`が最後の式、2ではない場合は`days = month_days[month - 1]`が最後の式です。`if year % 4 == 0`をみるとさらに`if`が入れ子になっていて、最終的に全て`days = 【何か】`という代入式が最後に評価された式になります。つまり、`days = 【何か】`を式として評価したときに、返す値がそのまま各`if`でも返す値になり、最終的にメソッドが返す値になると言うことです。そして、代入式は単純に代入された値を返します。結局の所、`days`に代入された値がメソッドの返り値になっているのです。なので、`return days`が無かったとしても、いまのコードではどの`if`分岐を辿っても`days`への代入で終わるので、ちゃんとした値が返ると言うことです。`return days`と各所の`days =`を削除して、値だけにしても、同じになることが確認できると思います。
5
+ もうちょっと、細かく説明していきます。`return days`が無かった場合を考えます。一番最後の式は、`if month == 2`から始まってそれに対応する`end`です。つまり、メソッドの返り値としてこの式の値が返されます。では中身を見ると、もし、monthが2の場合は`if year % 4 == 0`から始まってそれに対応する`end`が最後の式、2ではない場合は`days = month_days[month - 1]`が最後の式です。`if year % 4 == 0`をみるとさらに`if`が入れ子になっていて、最終的に全て`days = 【何か】`という代入式が最後に評価された式になります。つまり、`days = 【何か】`を式として評価したときに、返す値がそのまま各`if`でも返す値になり、最終的にメソッドが返す値になると言うことです。そして、代入式は単純に代入された値を返します。結局の所、`days`に代入された値がメソッドの返り値になっているのです。なので、`return days`が無かったとしても、いまのコードではどの`if`分岐を辿っても`days`への代入で終わるので、ちゃんとした値が返ると言うことです。`return days`と各所の`days =`を削除して、値だけにしても、同じになることが確認できると思います。
6
6
 
7
7
 
8
8
 
9
9
  では、`return days`を消しちゃっていいかというとそうではありません。もし、`return days`が無ければ、全ての`if`分岐について最後に評価される式の値が返り値としたいかを確認する必要があるからです。ちょっとかえただけでうまく値を返さずに、わかりにくいバグのもとになります。たとえば、デバッグ用に`days = 28`の後だけ`puts "#{year} is a leap year!"`とかつけたらどうでしょう?閏年の時だけ`puts`の式が最後になって、おかしくなってしまいます。いいコードというのは、こういった変更に強い(全体を変えなくても部分的な変更ができる)コードです。ですので、模範解答は`return days`をつけて、部分的な変更があっても意味が変わらないようにしているのです。
10
+
11
+ ---
12
+
13
+
14
+
15
+ 上を読み返してみると、自分でも何言っているのかわかりませんでした。
16
+
17
+
18
+
19
+ **Rubyの仕様上、returnが無くてもこのコードは動くけど、説明がちょっと複雑だから、わかりやすいコードになるようにちゃんとreturnを書こうね!**
20
+
21
+
22
+
23
+ って、覚えておけば大丈夫っす!