From: chris@... Date: 2020-10-20T15:55:47+00:00 Subject: [ruby-core:100446] [Ruby master Misc#17199] id outputed by inspect and to_s output does not allow to find actual object_id and vice-versa Issue #17199 has been updated by chrisseaton (Chris Seaton). Additional context is that `#object_id` used to the object's address, and is now a simple incrementing number, and `#inspect` still and has always used the object's address. I believe the documentation is correct though? https://ruby-doc.org/core-2.7.2/Object.html#method-i-inspect Note that an additional complicating issue is that Ruby objects may now move, so addresses are not stable, and so *the result of `#inspect` is not stable*. Two calls to `#inspect` on the same object can return different values non-deterministically. Is that what we want? I think that `#inspect` should be changed to use `#object_id`. ---------------------------------------- Misc #17199: id outputed by inspect and to_s output does not allow to find actual object_id and vice-versa https://bugs.ruby-lang.org/issues/17199#change-88065 * Author: Annih (Baptiste Courtois) * Status: Open * Priority: Normal ---------------------------------------- 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 ``` ruby 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=#, #inspect=#, #__id__=6881620, shifted_id=d202a8" ``` ## with ruby >= 2.7 ``` ruby 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=#, #inspect=#, #__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: 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](https://www.ruby-forum.com/t/understanding-object-id-in-ruby-2-7/260268/4) where people dived a bit more than me into ruby's code. -- https://bugs.ruby-lang.org/ Unsubscribe: