⛳
[Feature #20912] #__id__ を再定義したときに警告を出す提案
[Feature #20912] Add warning when redefining id as well as object_id
- 次のように
#object_id
や#__send__
を再定義すると警告がでます
class X
# warning: redefining `object_id' may cause serious problems
def object_id = nil
# warning: redefining `__send__' may cause serious problems
def __send__ = nil
end
- またメソッドを削除したときにも同様に警告がでます
class X
# warning: undefining `object_id' may cause serious problems
undef_method :object_id
# warning: undefining `__send__' may cause serious problems
undef_method :__send__
end
- これと同様に
#__id__
でも警告を出すようにし、また#object_id
では警告がでないようにする提案になります - これなんですが
#object_id
はKenrel
で定義されている一方#__send__
と#__id__
はBasicObject
で定義されているんですよね
class X
end
pp Object.instance_method(:object_id).owner # => Kernel
pp Object.instance_method(:__send__).owner # => BasicObject
pp Object.instance_method(:__id__).owner # => BasicObject
- なので
#__send__
に合わせるのであれば#__id__
も同様に警告が出るほうがよいのがモチベーションになっているみたいですね - コメントでは
#__id__
に対する警告を追加すること自体は肯定的なんですが#object_id
への警告を削除する方は否定的みたいですね -
#object_id
は割と一般的に利用されており#object_id
が再定義されることで意図しない動作につながる可能性があります- https://bugs.ruby-lang.org/issues/20912#note-5
- もし
#object_id
が再定義される前提であれば#__id__
を利用するようにする必要がある
- このチケットでは
#__id__
が再定義、もしくは削除されたときのみ警告を出すようになりました - この変更は開発版の Ruby 3.4-dev ですでに実装済みです
- ちなみにコメントで
#__id__
と#object_id
の2つが存在している経緯が書いてありました- 元々は
Object#id
だけが存在していた -
Object#id
が再定義された場合を考慮してObject#__id__
を追加した -
Object#object_id
も追加された- これは
#__id__
の見た目がひどかったので変わりに#object_id
が追加されたみたいですね
- これは
-
Object#id
が削除された - 今に至る
- https://bugs.ruby-lang.org/issues/20912#note-5
- 元々は
Discussion