Project

General

Profile

Actions

Misc #17199

open

id outputed by inspect and to_s output does not allow to find actual object_id and vice-versa

Added by Annih (Baptiste Courtois) about 4 years ago. Updated about 4 years ago.

Status:
Open
Assignee:
-
[ruby-core:100200]

Description

Hello, here is my first ruby issue sorry in advance if it is incorrectly filled.

Issue

The value returned by #object_id is not aligned anymore with displayed info in #inspect and #to_s methods.

with ruby < 2.7

Object.new.tap { |o| p "#to_s=#{o.to_s}, #inspect=#{o.inspect}, #__id__=#{o.__id__}, shifted_id=#{(o.__id__ << 1).to_s(16)}" }
"#to_s=#<Object:0x0000000000d202a8>, #inspect=#<Object:0x0000000000d202a8>, #__id__=6881620, shifted_id=d202a8"

with ruby >= 2.7

 Object.new.tap { |o| p "#to_s=#{o.to_s}, #inspect=#{o.inspect}, #__id__=#{o.__id__}, shifted_id=#{(o.__id__ << 1).to
s(16)}" }
"#to_s=#<Object:0x0000555dc8640b88>, #inspect=#<Object:0x0000555dc8640b88>, #__id__=220, shifted_id=1b8"

Consequences

It makes harder:

  • to implement a clean override of the #inspect method. i.e. How to keep the same output without ability to compute to the same "object_id" value.
  • to debug the object using the inspect output. i.e. ObjectSpace._id2ref(id_from_inspect >> 1) used to work, now it doesn't (RangeError: <xXx> is not id value).

Suggestion

IMHO either:

  • the #to_s and #inspect documentation are obsolete The default [...] [shows|prints] [...] an encoding of the object id and the change could have been a bit more advertised
  • they should use the result of #object_id instead of displaying the object pointer address

Another solution could be to provide a method to get access to the address, but I'm not sure you want that.

P.S. While debugging my problem I found this ruby-forum thread where people dived a bit more than me into ruby's code.


Files

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0