【一人 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

便利。