[ruby-core:122369] [Ruby Bug#21392] Data classes do not allow overriding #inspect

Issue #21392 has been reported by austin (Austin Ziegler). ---------------------------------------- Bug #21392: Data classes do not allow overriding #inspect https://bugs.ruby-lang.org/issues/21392 * Author: austin (Austin Ziegler) * Status: Open * ruby -v: 3.4.4 * Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- I'm preparing a new version of Color and I have decided to make all of the colour classes Data classes. However, it does not appear that `#inspect` can be overridden: ```ruby module Color CIELAB = Data.define(:l, :a, :b) do def inspect "CIELAB [%.4f%% %.4f %.4f]" % [l, a, b] end end end p Color::CIELAB[1,2,3] # Expected => CIELAB[1.000% 2.000 3.000] # Actual #<data Color::CIELAB l=10, a=-125.0, b=20.5> ``` This feels like it should be permitted. -- https://bugs.ruby-lang.org/

Issue #21392 has been updated by nobu (Nobuyoshi Nakada). Status changed from Open to Feedback I get the expected results for 3.2..master. ---------------------------------------- Bug #21392: Data classes do not allow overriding #inspect https://bugs.ruby-lang.org/issues/21392#change-113516 * Author: austin (Austin Ziegler) * Status: Feedback * ruby -v: 3.4.4 * Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- I'm preparing a new version of Color and I have decided to make all of the colour classes Data classes. However, it does not appear that `#inspect` can be overridden: ```ruby module Color CIELAB = Data.define(:l, :a, :b) do def inspect "CIELAB [%.4f%% %.4f %.4f]" % [l, a, b] end end end p Color::CIELAB[1,2,3] # Expected => CIELAB[1.000% 2.000 3.000] # Actual #<data Color::CIELAB l=10, a=-125.0, b=20.5> ``` This feels like it should be permitted. -- https://bugs.ruby-lang.org/

Issue #21392 has been updated by mame (Yusuke Endoh). I cannot reproduce the issue neither. ``` $ cat t.rb module Color CIELAB = Data.define(:l, :a, :b) do def inspect "CIELAB [%.4f%% %.4f %.4f]" % [l, a, b] end end end p Color::CIELAB[1,2,3] $ ruby -v t.rb ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-linux] CIELAB [1.0000% 2.0000 3.0000] ``` ---------------------------------------- Bug #21392: Data classes do not allow overriding #inspect https://bugs.ruby-lang.org/issues/21392#change-113517 * Author: austin (Austin Ziegler) * Status: Feedback * ruby -v: 3.4.4 * Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- I'm preparing a new version of Color and I have decided to make all of the colour classes Data classes. However, it does not appear that `#inspect` can be overridden: ```ruby module Color CIELAB = Data.define(:l, :a, :b) do def inspect "CIELAB [%.4f%% %.4f %.4f]" % [l, a, b] end end end p Color::CIELAB[1,2,3] # Expected => CIELAB[1.000% 2.000 3.000] # Actual #<data Color::CIELAB l=10, a=-125.0, b=20.5> ``` This feels like it should be permitted. -- https://bugs.ruby-lang.org/

Issue #21392 has been updated by austin (Austin Ziegler). You are correct (and I should have known better; I have unit tests proving this). I'm not sure if this is an IRB issue, because IRB's output always outputs `<data …>`. ``` irb(main):002> p Color::CIELAB[1,2,3] CIELAB [1.0000% 2.0000 3.0000] => #<data Color::CIELAB l=1, a=2, b=3> ``` ---------------------------------------- Bug #21392: Data classes do not allow overriding #inspect https://bugs.ruby-lang.org/issues/21392#change-113518 * Author: austin (Austin Ziegler) * Status: Feedback * ruby -v: 3.4.4 * Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- I'm preparing a new version of Color and I have decided to make all of the colour classes Data classes. However, it does not appear that `#inspect` can be overridden: ```ruby module Color CIELAB = Data.define(:l, :a, :b) do def inspect "CIELAB [%.4f%% %.4f %.4f]" % [l, a, b] end end end p Color::CIELAB[1,2,3] # Expected => CIELAB[1.000% 2.000 3.000] # Actual #<data Color::CIELAB l=10, a=-125.0, b=20.5> ``` This feels like it should be permitted. -- https://bugs.ruby-lang.org/

Issue #21392 has been updated by mame (Yusuke Endoh). Status changed from Feedback to Assigned Assignee set to ima1zumi (Mari Imaizumi) Thank you, confirmed. @ima1zumi @tompng Can you take a look? ``` $ irb irb(main):001* module Color irb(main):002* CIELAB = Data.define(:l, :a, :b) do irb(main):003* def inspect irb(main):004* "CIELAB [%.4f%% %.4f %.4f]" % [l, a, b] irb(main):005* end irb(main):006* end irb(main):007> end => Color::CIELAB irb(main):008> Color::CIELAB[1,2,3] => #<data Color::CIELAB l=1, a=2, b=3> ``` ---------------------------------------- Bug #21392: Data classes do not allow overriding #inspect https://bugs.ruby-lang.org/issues/21392#change-113519 * Author: austin (Austin Ziegler) * Status: Assigned * Assignee: ima1zumi (Mari Imaizumi) * ruby -v: 3.4.4 * Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- I'm preparing a new version of Color and I have decided to make all of the colour classes Data classes. However, it does not appear that `#inspect` can be overridden: ```ruby module Color CIELAB = Data.define(:l, :a, :b) do def inspect "CIELAB [%.4f%% %.4f %.4f]" % [l, a, b] end end end p Color::CIELAB[1,2,3] # Expected => CIELAB[1.000% 2.000 3.000] # Actual #<data Color::CIELAB l=10, a=-125.0, b=20.5> ``` This feels like it should be permitted. -- https://bugs.ruby-lang.org/

Issue #21392 has been updated by nobu (Nobuyoshi Nakada). austin (Austin Ziegler) wrote in #note-3:
You are correct (and I should have known better; I have unit tests proving this).
What unit tests? You can define `pretty_print` for IRB. ```ruby def pretty_print(q) q.text "CIELAB" q.breakable q.group 2, "[", "]" do q.text "%.4f%%" % l q.breakable q.text "%.4f" % a q.breakable q.text "%.4f" % b end end ``` ---------------------------------------- Bug #21392: Data classes do not allow overriding #inspect https://bugs.ruby-lang.org/issues/21392#change-113523 * Author: austin (Austin Ziegler) * Status: Assigned * Assignee: ima1zumi (Mari Imaizumi) * ruby -v: 3.4.4 * Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- I'm preparing a new version of Color and I have decided to make all of the colour classes Data classes. However, it does not appear that `#inspect` can be overridden: ```ruby module Color CIELAB = Data.define(:l, :a, :b) do def inspect "CIELAB [%.4f%% %.4f %.4f]" % [l, a, b] end end end p Color::CIELAB[1,2,3] # Expected => CIELAB[1.000% 2.000 3.000] # Actual #<data Color::CIELAB l=10, a=-125.0, b=20.5> ``` This feels like it should be permitted. -- https://bugs.ruby-lang.org/

Issue #21392 has been updated by austin (Austin Ziegler). nobu (Nobuyoshi Nakada) wrote in #note-5:
austin (Austin Ziegler) wrote in #note-3:
You are correct (and I should have known better; I have unit tests proving this).
What unit tests?
In my feature branch where I'm converting to Data classes.
You can define `pretty_print` for IRB.
```ruby def pretty_print(q) q.text "CIELAB" q.breakable q.group 2, "[", "]" do q.text "%.4f%%" % l q.breakable q.text "%.4f" % a q.breakable q.text "%.4f" % b end end ```
This is the problem, of course, with having maintained something backwards compatible (Color is currently _nominally_ valid for 1.8) as long as I have. I wasn't aware that there was a new call for defining a pretty print, because IRB *used* to fall back to `inspect`. However, `Data` classes presumably define a pretty printer and overrides `#inspect` within IRB. This is good to know, and I'll define a `pretty_print` method. This can be closed. ---------------------------------------- Bug #21392: Data classes do not allow overriding #inspect https://bugs.ruby-lang.org/issues/21392#change-113532 * Author: austin (Austin Ziegler) * Status: Assigned * Assignee: ima1zumi (Mari Imaizumi) * ruby -v: 3.4.4 * Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- I'm preparing a new version of Color and I have decided to make all of the colour classes Data classes. However, it does not appear that `#inspect` can be overridden: ```ruby module Color CIELAB = Data.define(:l, :a, :b) do def inspect "CIELAB [%.4f%% %.4f %.4f]" % [l, a, b] end end end p Color::CIELAB[1,2,3] # Expected => CIELAB[1.000% 2.000 3.000] # Actual #<data Color::CIELAB l=10, a=-125.0, b=20.5> ``` This feels like it should be permitted. -- https://bugs.ruby-lang.org/

Issue #21392 has been updated by alanwu (Alan Wu). Status changed from Assigned to Closed Closing as requested. ---------------------------------------- Bug #21392: Data classes do not allow overriding #inspect https://bugs.ruby-lang.org/issues/21392#change-113638 * Author: austin (Austin Ziegler) * Status: Closed * Assignee: ima1zumi (Mari Imaizumi) * ruby -v: 3.4.4 * Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- I'm preparing a new version of Color and I have decided to make all of the colour classes Data classes. However, it does not appear that `#inspect` can be overridden: ```ruby module Color CIELAB = Data.define(:l, :a, :b) do def inspect "CIELAB [%.4f%% %.4f %.4f]" % [l, a, b] end end end p Color::CIELAB[1,2,3] # Expected => CIELAB[1.000% 2.000 3.000] # Actual #<data Color::CIELAB l=10, a=-125.0, b=20.5> ``` This feels like it should be permitted. -- https://bugs.ruby-lang.org/
participants (4)
-
alanwu (Alan Wu)
-
austin (Austin Ziegler)
-
mame (Yusuke Endoh)
-
nobu (Nobuyoshi Nakada)