From: manga.osyo@... Date: 2021-03-31T03:04:09+00:00 Subject: [ruby-dev:51039] [Ruby master Bug#17764] ブロック付きメソッドにおけるproc(または Proc.new)の参照がArgumentErrorを吐く問題 Issue #17764 has been updated by osyo (manga osyo). firelzrd (Masahito Suzuki) wrote in #note-4: > ご返答ありがとうございます。 > ご主旨、理解いたしました。ご教示ありがとうございます。お騒がせいたしました。 > > つきましては、差し支えなければ、 > ①ブロック引数として渡されたprocをメソッド内で変数として参照したい > ②メソッド呼び出し時のブロック引数は省略可能にしておきたい > というニーズが両立する場合にどのようにすればよいか、ヒントをいただければ幸いです。 > > ①を実現するだけならば&の付いたブロック引数を取ればよさそうですが… > > あるメソッドにブロックが渡された場合にはprocをインスタンス変数に代入しておいて、後でcallbackする、という使い方を想定しています。 > 何卒ご教示を賜われれば幸いです。 > > 以上よろしくお願いいたします。 > やりたいこととしてはこういうことでしょうか? ```ruby def foo(&block) # ブロック引数がない場合は block は nil になる puts (block ? block : proc{"ブロックなし"}).call end foo #ブロックなし => "ブロックなし" foo{"ブロックあり"} # ブロックあり => "ブロックあり" ``` ---------------------------------------- Bug #17764: ブロック付きメソッドにおけるproc(または Proc.new)の参照がArgumentErrorを吐く問題 https://bugs.ruby-lang.org/issues/17764#change-91196 * Author: firelzrd (Masahito Suzuki) * Status: Closed * Priority: Normal * ruby -v: ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux] * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN ---------------------------------------- # ブロック付きメソッドにおけるproc(または Proc.new)の参照がArgumentErrorを吐く問題 # Ruby 3.0.0 linux x86-64およびWindows上のmingw-x86-64バイナリにて発生し、2.7.2-1ではいずれも発生しないことを確認済み。 # また、2021/3/31現在、TryRubyサイト( https://try.ruby-lang.org/ ) の上でも発生することを確認済み。 def foo puts (block_given? ? proc : proc{"ブロックなし"}).call end # @ruby 3.0.0 foo #ブロックなし => "ブロックなし" foo{"ブロックあり"} #ブロックあり => ArgumentError: tried to create Proc object without a block # @ruby 2.7.2 foo #ブロックなし => "ブロックなし" foo{"ブロックあり"} #ブロックあり => "ブロックあり" ---Files-------------------------------- argumenterror.png (125 KB) -- https://bugs.ruby-lang.org/