Actions
Misc #17199
openid outputed by inspect and to_s output does not allow to find actual object_id and vice-versa
Status:
Open
Assignee:
-
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 obsoleteThe 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
Like0
Like0Like0Like0Like0Like0Like0