🦔
[Feature #15408] ObjectSpace._id2ref を削除するチケット
[Feature #15408] Deprecate ObjectSpace._id2ref
- NOTE: このチケットが起票されたのは6年前
- Ruby では任意のオブジェクトから一意となるような値を取得する
#object_idとその値から元のオブジェクトを取得できるObjectSpace.#_id2ref存在しています
a = "hoge"
# 何かしら一意となる値を返す
p a.object_id # => 16
# 値が同じだからといって同じ object_id とは限らない
b = "hoge"
p b.object_id # => 24
# ObjectSpace._id2ref から object_id を元にして元のオブジェクトを参照することもできる
p ObjectSpace._id2ref(a.object_id) #=> "hoge"
- これなんですが前提として
#object_idが一意である必要があるんですが実際には『ガベージコレクションされたあとにはその限りではない』らしいです- ただ、この話なんですがチケットが起票された6年前はそうだったみたいなんですが現状だと
#object_idの割当の仕組みが変わっているらしく問題にならなくなったみたいですね - https://bugs.ruby-lang.org/issues/15408#note-41
- ただ、この話なんですがチケットが起票された6年前はそうだったみたいなんですが現状だと
- なのでこのチケットでは
#object_idとそれを利用するObjectSpace.#_id2refを削除する、という旨のチケットになっています - 議論自体は長いので内容は省略するんですが6年前の時点では以下の点で matz が同意したみたいですね
-
_id2refは削除する -
object_idは広く利用されているのでそのままにする - https://bugs.ruby-lang.org/issues/15408#note-32
-
- また、当時の標準ライブラリで
ObjectSpace.#_id2refを利用しているのは DRb だけみたいでそちらはObjectSpace::WeakMapを利用することで回避したみたいですね- [Bug #15711] Remove use of _id2ref from DRb
-
ObjectSpace::WeakMapを利用することで GC された場合でもあとからオブジェクトを参照するような仕組みにしているみたいですね
- って、いうのが6年前の話なんですが実際にはまだ
ObjectSpace.#_id2refは削除されずにそのまま利用できる状態でした - これが Ruby 3.5 からは『
ObjectSpace.#_id2refを使用すると警告が表示される』ようになります-
-W:deprecatedがついているときのみ警告が出力される
-
Warning[:deprecated] = true
a = "hoge"
# 何かしら一意となる値を返す
p a.object_id # => 16
# ObjectSpace._id2ref から object_id を元にして元のオブジェクトを参照することもできる
p ObjectSpace._id2ref(a.object_id) #=> "hoge"
# Ruby 3.4 => no warning
# Ruby 3.5 => warning: ObjectSpace._id2ref is deprecated
- 将来的に
ObjectSpace.#_id2refは削除されると思いますがそれがいつなのかはまだ決まってないみたいですね - ちなみに
_id2refは唯一アンダースコアから始まるメソッドらしい
Discussion