returnについて思うこと。
rubyの関数ではreturnを省略できますが、個人的には明示する方がよいかなと思っています。理由は以下の2つ。
- 何が返されるのかが、わかりやすい。
- returnに続く処理を読めば、何が返されてくるか一目瞭然です。
- というか、returnがないと、そもそも戻り値を返すことを意図した関数なのか、最後の実行結果がたまたま返されているだけなのかもわからん。
- 処理の流れが追いやすい。
- returnを探せば処理の終わりが見えます。
また、ネストが嫌いのなので↓こういうリファクタが好き。結果的にreturnをよく使うことになります。
# リファクタ前 def foo(arg) if ( arg ) ...処理 end end # リファクタ後 def foo(arg) return if !arg ...処理 end
ということで、ソース中にreturnを書きまくっているわけですが、このせいでよくはまるワナが。
# リストの要素をランダムにソート def random_sort( list ) return list.sort_by {|i| return rand # 要素ごとにランダムな値を作成し、それでソートする。 } end p random_sort( ["a","b","c","d","e"] )
実行結果です。
0.850139812997235 # あれ?
・・・えぇ、ブロックでreturnしちゃうわけです。そこでそのまま関数から脱出してしまうと。期待通りの動作をさせるためには、こう書かないといけません。
def random_sort( list ) return list.sort_by {|i| rand } end
実行結果です。
["d", "b", "a", "e", "c"]
ブロックが関数で囲まれていなければエラーになるのですぐにわかるんですが、関数内だとエラーにならないので気づきにくい。要注意です。