Bug #21392
closedData classes do not allow overriding #inspect
Description
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:
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.
Updated by nobu (Nobuyoshi Nakada) 4 days ago
· Edited
- Status changed from Open to Feedback
I get the "Expected" results for 3.2..master, not your "Actual".
Updated by mame (Yusuke Endoh) 3 days ago
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]
Updated by austin (Austin Ziegler) 3 days ago
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>
Updated by mame (Yusuke Endoh) 3 days ago
- Status changed from Feedback to Assigned
- Assignee set to ima1zumi (Mari Imaizumi)
Thank you, confirmed. @ima1zumi (Mari Imaizumi) @tompng (tomoya ishida) 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>
Updated by nobu (Nobuyoshi Nakada) 3 days ago
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.
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
Updated by austin (Austin Ziegler) 2 days ago
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.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.
Updated by alanwu (Alan Wu) about 1 hour ago
- Status changed from Assigned to Closed
Closing as requested.