ref:http://www.kmonos.net/wlog/95.html#_1109090307
を見ていて、全然関係ないけど前ちょっと考えたくだらないことを思い出しました。
しばしば return を自分で定義したくなることがあります。例えば、最初に引数を検査して、だめだったら return するとき。
# 引数を検査するメソッド def check(*args) # 検査 return bool # true or false end def foo(*args) return unless check(*args) # 検査 # メイン処理 end
というように、引数検査する全メソッドで return unless と書いていくのが面倒だなあと思うのです。return unless を面倒がってるレベルなので、例外や throw やブロックでは解決しません (begin と rescue; end が離れた箇所に書く必要がある上に、インデントが増える) 。
そこで、こう書けたら嬉しいかなあと。
# 引数を検査するスレッド def guard(*args) # 検査 return return bool # 「return bool」というようなものを返すイメージ end def foo(*args) guard(*args) # 「return bool」というようなものが返されたらすぐ return する # メイン処理 end
要するに return するときにスタックフレームを何段 pop するかを指定できるようにしようぜってことなんですが、うーん我ながら気持ち悪い。バグの元か。
ちなみに return return という記法にする理由は、n 段 return するために
eval("return " * n + "bool")
という嫌なコードを書せることで、強制はしないものの推奨はしないという気分を伝えるとかどうでもいい感じのことも考えた。
もしくは、ブロックなし catch を呼んだあとに定義したメソッドは暗黙的に catch するとか。public/private みたいに。
# 引数を検査するスレッド def guard(*args) # 検査 throw(:NG) bool end catch(:NG) # 以下で定義するメソッドは :NG を catch する def foo(*args) goard(*args) end
うーん微妙だ。そんなことより memoize メソッドを先に作れ。