【一人 bugs.ruby Advent Calendar 2021】[Feature #18276] `Proc#bind_call(obj)` same as `obj.instance_exec(..., &proc_obj)`【11日目】
一人 bugs.ruby Advent Calendar 2021 11日目の記事になります。
今回は obj.instance_exec(..., &proc_obj)
と同じ意味の Proc#bind_call(obj)
を追加する話です。
[Feature #18276] Proc#bind_call(obj)
same as obj.instance_exec(..., &proc_obj)
obj.instance_exec(..., &proc_obj)
と同じ意味の Proc#bind_call(obj)
を追加する提案です。
obj.instance_exec(..., &proc_obj)
を proc_obj.bind_call(...)
のように書くことができるようになります。
もともとは [Bug #18243] への対応として Ractor
の共有可能オブジェクトの Proc#call
を禁止して obj.instance_exec(..., &proc_obj)
で呼び出すようにすることも考慮しているらしいです。
そのショートカットとして Proc#bind_call
を使用する想定みたい。
Proc#bind_call
だと以下のように block
オブジェクトも渡せるようようになるので個人的には普通にほしい。
pr = proc { |*args, &block| # ... block.call(something) } # pr に対してブロック引数を渡すことができない obj.instance_exec(arg, &pr) # bind_call だと pr に対してブロック引数を渡すことができる pr.bind_call(obj, arg) do |something| # ... end
現在はこの提案は Reject されているようですね。残念。
関係ないけどこれを読んで昔同じようなことをする gem つくったのを思い出した。
require "proc/unbind" using Proc::Unbind class X attr_accessor :value end x = X.new set = proc { |x| @value = x } # Proc#rebind で特定のオブジェクトに bind する set.rebind(x).call(42) p x.value # => 42
便利。