高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

Ruby勉強中

Webサイト作成のためにRubyを勉強中。lambdaとかのっけからいろいろ出てきてますw

――とりあえず、今日覚えたことは、lambdaメソッドで作るProcオブジェクトと、Object#methodで作るMethodオブジェクトの扱いは違うみたい。前者で作ったオブジェクトをcallして、さらにブロックを渡すと怒られますが、後者は怒られなかった。

mod_if = lambda{|args|
  p args 
  yield 10
  yield 20
  yield 30
}
mod_if.call(["a", "b", "c"]){|v| 
  p v
}

このばあい、mod_if.callを呼んだ時点でLocalJumpError(no block given)が発生します。原因は不明(LocalJumpError#reasonは:noreason リファレンスには記載のない値です)


しかしこうすると、うまくいく

def mod_if(args) 
  p args 
  yield 10
  yield 20
  yield 30
end
c = self.method(:mod_if)
c.call(["a", "b", "c"]){|v| 
  p v
}

この場合出力は以下となります

["a", "b", "c"]
10
20
30

たぶん実運用では後者を使うことになるので良いでしょうが、なんだか気になりますね。なんででしょう。