Ruby 2.5.0 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Procクラス > new
new -> Proc
[permalink][rdoc]new { ... } -> Proc
ブロックをコンテキストとともにオブジェクト化して返します。
ブロックを指定しない場合、Ruby 2.7 では $VERBOSE = true のときには警告メッセージ「warning: Capturing the given block using Proc.new is deprecated; use `&block` instead」が出力され、Ruby 3.0 では ArgumentError (tried to create Proc object without a block) が発生します。
ブロックを指定しなければ、このメソッドを呼び出したメソッドがブロックを伴うときに、それを Proc オブジェクトとして生成して返します。
ただし、ブロックを指定しない呼び出しは推奨されていません。呼び出し元のメソッドで指定されたブロックを得たい場合は明示的に & 引数でうけるべきです。
例
def foo
pr = Proc.new
pr.call(1)
end
foo {|arg| p arg }
# => 1
これは以下と同じです。
例
def foo
yield(1)
end
foo {|arg| p arg }
# => 1
呼び出し元のメソッドがブロックを伴わなければ、例外 ArgumentError が発生します。
例
def foo
Proc.new
end
foo
# => -:2:in `new': tried to create Proc object without a block (ArgumentError)
# from -:2:in `foo'
# from -:4:in `<main>'
Proc.new は、Proc#initialize が定義されていればオブジェクトの初期化のためにこれを呼び出します。このことを除けば、Kernel.#proc と同じです。