Proc.newをブロックなしで使う方法は3.0ではエラーで動作しない
Closed this issue · 2 comments
https://docs.ruby-lang.org/ja/latest/doc/spec=2fdef.html#method
にある、「イテレータの定義」で使われているProc.new
をブロックなしで使う方法はRuby 3.0以降では動作しないようです(tried to create Proc object without a block (ArgumentError)
)。Ruby 2.7で動作することは確認しています。
不思議なことにこの変更点は3.0のNEWSファイル( https://github.com/ruby/ruby/blob/v3_0_0/NEWS.md )には記載がありません。
2.7.0でブロックなしprocに対して非推奨の警告がでるようになっていたのですが、
2.7.2でRuby全体でデフォルトで警告がでなくなって、
3.0.0でブロックなしprocは動かなくなったみたいですね。
ところで、「イテレータの定義」って小題は、変な気がしますね。「ブロック付きメソッド」?
参考
プロと読み解くRuby 2.7 NEWS - クックパッド開発者ブログ
ここの「proc/lambda
をブロックなしで呼ぶのは非推奨/禁止になりました」の項目
https://github.com/ruby/ruby/blob/ruby_2_7/NEWS#proclambda-without-block-is-deprecated-
2.7のNEWSファイル
https://www.ruby-lang.org/ja/news/2020/10/02/ruby-2-7-2-released/
2.7.2 以降では deprecated カテゴリの警告はデフォルトの状態で出力が抑制されます。
https://i.loveruby.net/ja/ruby/iterator.html
2003/06/18
最初に言っておくと、最近の Ruby 界では「イテレータ」という名称はあんま し好まれてない。くりかえさないイテレータが増えてきたっていうのが理由だ。 ではなんと呼べばいいのかっていうと、「ブロック付きメソッド」とか言うらしい。 どうも好きじゃないなあこの名称。
余談ですが、Enumerator.newのブロックなしの例も3.0から同じエラーがでて動かないですね。
Procを作ろうとしてないのにと思いましたが(?)
str = "xyz"
enum = Enumerator.new(str, :each_byte)
# prog.rb:3:in `initialize': tried to create Proc object without a block (ArgumentError)
https://docs.ruby-lang.org/ja/latest/method/Enumerator/s/new.html