Project

General

Profile

Actions

Feature #21389

open

Simplify Set#inspect output

Added by jeremyevans0 (Jeremy Evans) 5 days ago. Updated 1 day ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:122355]

Description

As Set is now a core collection class, it should have special inspect output. Ideally, inspect output should be suitable to eval, similar to array and hash (assuming the elements are also suitable to eval):

set = Set[1, 2, 3]
eval(set.inspect) == set # should be true

The simplest way to do this is to use the Set[] syntax:

Set[1, 2, 3].inspect
# => "Set[1, 2, 3]"

I've submitted a pull request that implements this: https://github.com/ruby/ruby/pull/13488

The pull request deliberately does not use any subclass name in the output, similar to array and hash. I think it is more important that users know they are dealing with a set than which subclass:

Class.new(Set)[]
# PR does: Set[]
#     not: #<Class:0x00000c21c78699e0>[]

However, it's easy to change the PR to use a subclass name if that is desired.


Related issues 1 (1 open0 closed)

Related to Ruby - Bug #21377: core Set#inspect does not use inherited class nameOpenActions
Actions #1

Updated by Eregon (Benoit Daloze) 5 days ago

  • Related to Bug #21377: core Set#inspect does not use inherited class name added

Updated by Eregon (Benoit Daloze) 5 days ago

Per https://bugs.ruby-lang.org/issues/21377#note-5 (that issue should have been linked BTW, I added it),
I strongly believe showing Set[1, 2, 3] instead of MySet[1, 2, 3] for an instance of MySet would be a mistake.

Array and Hash don't show the class name at all, then sure obviously they don't show the subclass name either.
No inspect, if it shows the class name, should ever show the wrong class name, i.e., not obj.class.inspect, that would just be intentional confusion and there is no reason for that.

The example with an anonymous subclass is unrepresentative of realistic usages so hardly matters in comparison.

BTW here is an example of a core class showing the subclass name:

class MyModule < Module; end
p MyModule.new # => #<MyModule:0x00007f4e318e3ad8>

Updated by matz (Yukihiro Matsumoto) 1 day ago

I prefer Set[1, 2, 3] to #<Set: {1, 2, 3}>. And the name of the subclass should be printed, e.g. MySet[1, 2, 3].

Matz.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0