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 とか調べ始めると面白い。&の使い方など。
以下とか参考になる。今後のコードで効果的に使っていきたい。