読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

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"]

ブロックが関数で囲まれていなければエラーになるのですぐにわかるんですが、関数内だとエラーにならないので気づきにくい。要注意です。