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


ご教示大変ありがとうございます。
希望した動作ができました。

恥ずかしながら、ブロック引数の指定がない場合にnilとなる挙動を把握できていませんでした。勉強いたします。
諸兄のご親切に重ねて御礼申し上げます。

貴重なお時間をありがとうございました。

osyo (manga osyo) wrote in #note-5:
> やりたいこととしてはこういうことでしょうか?
> 
> ```ruby
> def foo(&block)
>   # ブロック引数がない場合は block は nil になる
>   puts (block ? block : proc{"ブロックなし"}).call
> end
> 
> foo #ブロックなし => "ブロックなし"
> foo{"ブロックあり"} # ブロックあり => "ブロックあり"
> ```

matz (Yukihiro Matsumoto) wrote in #note-6:
> 「メソッド呼び出し時のブロック引数は省略可能にしておきたい」という要求の正確な意味がわからなかったのですが、これが「引数リストに&blk変数を指定したくない」というものだとすれば、それは3.0からできなくなりました。これまではprocメソッドを引数なしで呼び出す方法でメソッドに渡されたブロックをProcとして取り出せていましたが、暗黙のコンテキスト参照が入りますし、読解の点からも望ましくないと考えての変更です。「&blk引数」を使ってください。それに、たぶんこっちのほうが高速です。
> 
> Matz.


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

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