lambda でクロージャを使ってみる
いくつかの関数を配列にまとめて入れてまとめて実行したくなったので初めて lambda を使ってみた。
- func1 と func2 を funcs 配列に入れて each でまとめて呼びたいケース
def func1( arg ) lambda { # arg を使っていろいろ if なんちゃらエラーチェック return #エラーの場合に return で処理を中断する end } end def func2( arg ) lambda { # arg を使っていろいろ } end def main a_arg = "hoge" funcs = [] funcs << func1( a_arg ) funcs << func2( a_arg ) funcs.each {| a_func | a_func.call } end main
なるほど、lambda をリターンするメソッドを作れば関数オブジェクトとして使えるしクロージャ(この場合は arg がクロージャ対象かな)としても使える。また、lambdaでは lambda 内のエラー処理で return で処理を打ち切れたけど、一見同じように使える Proc.new では「unexpected return (LocalJumpError)」というエラーになってしまった。break でも同様。ちょっとこの辺りの挙動の違いはまだよくわかっていない。
- return したらエラーになる例
def func3( arg ) Proc.new { # arg を使っていろいろ if なんちゃらエラーチェック return #エラーの場合に return で処理を中断する end } end
lambda とかブロックとか Proc とか調べ始めると面白い。&の使い方など。
以下とか参考になる。今後のコードで効果的に使っていきたい。
- sasata299's blog: Rubyで "&" を使うと幸せになれるらしいよ
- http://blog.livedoor.jp/sasata299/archives/51382454.html
- ソースコード備忘録Press: Ruby Proc.newとlambdaの違い
- http://yukirin.dontexist.org/archives/145