Kernel.#proc でブロックを渡さなかった時の挙動
さて、 Kernel.#proc
といえば普通は『ブロックをオブジェクトとして扱う時』に使用します。
# ブロックをオブジェクト化する plus = proc { |a, b| a + b } # もしくは Proc.new でもどうようの挙動になる # plus = proc { |a, b| a + b } # #call でブロックを評価する p plus.call 1, 2
細かい点は違いますが lambda {}
や -> {}
でも同様に使用することが出来ます。
では、この Kernel.#proc
に対してブロック引数を渡さなかった場合どうなるんでしょうか。
Kernel.#proc
にブロック引数を渡さなかった場合
Kernel.#proc
にブロック引数を渡さなかった場合、『そのメソッドのブロック引数』を返します。
def meth &block # meth のブロック引数を返す # block と同等 proc end # meth のブロック引数がそのまま返ってくる p meth { |a, b| a + b }.call 1, 2
一体どういう時に便利なのかわかりません…。
ブロック引数がない場合は nil
を返すのかな?と思ったんですが、エラーになってしまうみたいですね。
def meth proc end # Error: `proc': tried to create Proc object without a block (ArgumentError) meth
nil
を返すのであれば次のように使えるかとも思ったんですが、ダメそう
def meth if proc.nil? "Not found block." end yield(1, 2) end p meth { |a, b| a + b } p meth
飲み会の席などで『おれ Ruby しってるんだぜー』アピールに使用してください。