[#51033] [Ruby master Bug#17764] ブロック付きメソッドにおけるproc(または Proc.new)の参照がArgumentErrorを吐く問題 — firelzrd@...

Issue #17764 has been reported by firelzrd (Masahito Suzuki).

8 messages 2021/03/31

[ruby-dev:51038] [Ruby master Bug#17764] ブロック付きメソッドにおけるproc(または Proc.new)の参照がArgumentErrorを吐く問題

From: firelzrd@...
Date: 2021-03-31 02:57:08 UTC
List: ruby-dev #51038
Issue #17764 has been updated by firelzrd (Masahito Suzuki).


ご返答ありがとうございます。
ご主旨、理解いたしました。ご教示ありがとうございます。お騒がせいたしました。

つきましては、差し支えなければ、
①ブロック引数として渡されたprocをメソッド内で変数として参照したい
②メソッド呼び出し時のブロック引数は省略可能にしておきたい
というニーズが両立する場合にどのようにすればよいか、ヒントをいただければ幸いです。

①を実現するだけならば&の付いたブロック引数を取ればよさそうですが…

あるメソッドにブロックが渡された場合にはprocをインスタンス変数に代入しておいて、後でcallbackする、という使い方を想定しています。
何卒ご教示を賜われれば幸いです。

以上よろしくお願いいたします。

ko1 (Koichi Sasada) wrote in #note-3:
> ブロック付きメソッドの中でブロックなし `proc` したとき、エラーになるようになった、というのが、3.0 での変更点です。
> 
> ```ruby
> def foo
>   proc
> end
> foo{} #=> `proc': tried to create Proc object without a block (ArgumentError)
> ```



----------------------------------------
Bug #17764: ブロック付きメソッドにおけるproc(または Proc.new)の参照がArgumentErrorを吐く問題
https://bugs.ruby-lang.org/issues/17764#change-91195

* 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/

In This Thread