Project

General

Profile

Actions

Bug #21392

closed

Data classes do not allow overriding #inspect

Added by austin (Austin Ziegler) 4 days ago. Updated about 1 hour ago.

Status:
Closed
Target version:
-
[ruby-core:122369]

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.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0