[Feature #20912] #__id__ を再定義したときに警告を出す提案

2024/11/08に公開

[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_idKenrel で定義されている一方 #__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 が再定義されることで意図しない動作につながる可能性があります
  • このチケットでは #__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
GitHubで編集を提案

Discussion