ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
* [ruby-core:122355] [Ruby Feature#21389] Simplify Set#inspect output
@ 2025-06-01  3:36 jeremyevans0 (Jeremy Evans) via ruby-core
  2025-06-01 19:55 ` [ruby-core:122363] " Eregon (Benoit Daloze) via ruby-core
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: jeremyevans0 (Jeremy Evans) via ruby-core @ 2025-06-01  3:36 UTC (permalink / raw)
  To: ruby-core; +Cc: jeremyevans0 (Jeremy Evans)

Issue #21389 has been reported by jeremyevans0 (Jeremy Evans).

----------------------------------------
Feature #21389: Simplify Set#inspect output
https://bugs.ruby-lang.org/issues/21389

* Author: jeremyevans0 (Jeremy Evans)
* Status: Open
----------------------------------------
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):

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

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

```ruby
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:

```ruby
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.



-- 
https://bugs.ruby-lang.org/
______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [ruby-core:122363] [Ruby Feature#21389] Simplify Set#inspect output
  2025-06-01  3:36 [ruby-core:122355] [Ruby Feature#21389] Simplify Set#inspect output jeremyevans0 (Jeremy Evans) via ruby-core
@ 2025-06-01 19:55 ` Eregon (Benoit Daloze) via ruby-core
  2025-06-05  8:47 ` [ruby-core:122437] " matz (Yukihiro Matsumoto) via ruby-core
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Eregon (Benoit Daloze) via ruby-core @ 2025-06-01 19:55 UTC (permalink / raw)
  To: ruby-core; +Cc: Eregon (Benoit Daloze)

Issue #21389 has been updated by Eregon (Benoit Daloze).


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:
```ruby
class MyModule < Module; end
p MyModule.new # => #<MyModule:0x00007f4e318e3ad8>
```

----------------------------------------
Feature #21389: Simplify Set#inspect output
https://bugs.ruby-lang.org/issues/21389#change-113508

* Author: jeremyevans0 (Jeremy Evans)
* Status: Open
----------------------------------------
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):

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

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

```ruby
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:

```ruby
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.



-- 
https://bugs.ruby-lang.org/
______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [ruby-core:122437] [Ruby Feature#21389] Simplify Set#inspect output
  2025-06-01  3:36 [ruby-core:122355] [Ruby Feature#21389] Simplify Set#inspect output jeremyevans0 (Jeremy Evans) via ruby-core
  2025-06-01 19:55 ` [ruby-core:122363] " Eregon (Benoit Daloze) via ruby-core
@ 2025-06-05  8:47 ` matz (Yukihiro Matsumoto) via ruby-core
  2025-12-13 18:31 ` [ruby-core:124184] " zverok (Victor Shepelev) via ruby-core
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: matz (Yukihiro Matsumoto) via ruby-core @ 2025-06-05  8:47 UTC (permalink / raw)
  To: ruby-core; +Cc: matz (Yukihiro Matsumoto)

Issue #21389 has been updated by matz (Yukihiro Matsumoto).


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.


----------------------------------------
Feature #21389: Simplify Set#inspect output
https://bugs.ruby-lang.org/issues/21389#change-113618

* Author: jeremyevans0 (Jeremy Evans)
* Status: Open
----------------------------------------
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):

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

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

```ruby
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:

```ruby
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.



-- 
https://bugs.ruby-lang.org/
______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [ruby-core:124184] [Ruby Feature#21389] Simplify Set#inspect output
  2025-06-01  3:36 [ruby-core:122355] [Ruby Feature#21389] Simplify Set#inspect output jeremyevans0 (Jeremy Evans) via ruby-core
  2025-06-01 19:55 ` [ruby-core:122363] " Eregon (Benoit Daloze) via ruby-core
  2025-06-05  8:47 ` [ruby-core:122437] " matz (Yukihiro Matsumoto) via ruby-core
@ 2025-12-13 18:31 ` zverok (Victor Shepelev) via ruby-core
  2025-12-14  2:46 ` [ruby-core:124189] " jeremyevans0 (Jeremy Evans) via ruby-core
  2025-12-14  8:54 ` [ruby-core:124193] " zverok (Victor Shepelev) via ruby-core
  4 siblings, 0 replies; 6+ messages in thread
From: zverok (Victor Shepelev) via ruby-core @ 2025-12-13 18:31 UTC (permalink / raw)
  To: ruby-core; +Cc: zverok (Victor Shepelev)

Issue #21389 has been updated by zverok (Victor Shepelev).

Status changed from Closed to Open
Assignee set to jeremyevans0 (Jeremy Evans)

Just noticed that on the latest `master` subclasses `#inspect` didn't change (unlike what @matz suggests here: https://bugs.ruby-lang.org/issues/21389#note-3):

```ruby
class MySet < Set
end

p Set[1, 2, 3]   #=> Set[1, 2, 3]
p MySet[1, 2, 3] #=> #<MySet: {1, 2, 3}>
```

Is it deliberate? (Working on docs for the new release.)

----------------------------------------
Feature #21389: Simplify Set#inspect output
https://bugs.ruby-lang.org/issues/21389#change-115656

* Author: jeremyevans0 (Jeremy Evans)
* Status: Open
* Assignee: jeremyevans0 (Jeremy Evans)
----------------------------------------
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):

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

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

```ruby
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:

```ruby
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.



-- 
https://bugs.ruby-lang.org/
______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [ruby-core:124189] [Ruby Feature#21389] Simplify Set#inspect output
  2025-06-01  3:36 [ruby-core:122355] [Ruby Feature#21389] Simplify Set#inspect output jeremyevans0 (Jeremy Evans) via ruby-core
                   ` (2 preceding siblings ...)
  2025-12-13 18:31 ` [ruby-core:124184] " zverok (Victor Shepelev) via ruby-core
@ 2025-12-14  2:46 ` jeremyevans0 (Jeremy Evans) via ruby-core
  2025-12-14  8:54 ` [ruby-core:124193] " zverok (Victor Shepelev) via ruby-core
  4 siblings, 0 replies; 6+ messages in thread
From: jeremyevans0 (Jeremy Evans) via ruby-core @ 2025-12-14  2:46 UTC (permalink / raw)
  To: ruby-core; +Cc: jeremyevans0 (Jeremy Evans)

Issue #21389 has been updated by jeremyevans0 (Jeremy Evans).

Status changed from Open to Closed

zverok (Victor Shepelev) wrote in #note-5:
> Just noticed that on the latest `master` subclasses `#inspect` didn't change (unlike what @matz suggests here: https://bugs.ruby-lang.org/issues/21389#note-3):
> 
> ```ruby
> class MySet < Set
> end
> 
> p Set[1, 2, 3]   #=> Set[1, 2, 3]
> p MySet[1, 2, 3] #=> #<MySet: {1, 2, 3}>
> ```
> 
> Is it deliberate? (Working on docs for the new release.)

Yes, this is deliberate for backwards compatibility. Discussion in the GitHub PR: https://github.com/ruby/ruby/pull/15228

If you subclass from `Set::CoreSet` (which avoids adding backwards compatibility), the #inspect output follows the new Set output: https://github.com/ruby/ruby/pull/15228#discussion_r2539497376

The basic approach is that as much as possible, subclasses of Set behave as they did behavior. The only cases where the behavior isn't backwards compatible for Set subclasses is if the related methods accessed `@hash` (which no longer exists). In cases where `@hash` was accessed in stdlib Set, the backwards compatibility methods generally call `super` or another method.

Unless you need backwards compatibility with stdlib Set, I recommend subclassing from `Set::CoreSet` instead of `Set`.

----------------------------------------
Feature #21389: Simplify Set#inspect output
https://bugs.ruby-lang.org/issues/21389#change-115664

* Author: jeremyevans0 (Jeremy Evans)
* Status: Closed
* Assignee: jeremyevans0 (Jeremy Evans)
----------------------------------------
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):

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

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

```ruby
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:

```ruby
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.



-- 
https://bugs.ruby-lang.org/
______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [ruby-core:124193] [Ruby Feature#21389] Simplify Set#inspect output
  2025-06-01  3:36 [ruby-core:122355] [Ruby Feature#21389] Simplify Set#inspect output jeremyevans0 (Jeremy Evans) via ruby-core
                   ` (3 preceding siblings ...)
  2025-12-14  2:46 ` [ruby-core:124189] " jeremyevans0 (Jeremy Evans) via ruby-core
@ 2025-12-14  8:54 ` zverok (Victor Shepelev) via ruby-core
  4 siblings, 0 replies; 6+ messages in thread
From: zverok (Victor Shepelev) via ruby-core @ 2025-12-14  8:54 UTC (permalink / raw)
  To: ruby-core; +Cc: zverok (Victor Shepelev)

Issue #21389 has been updated by zverok (Victor Shepelev).


@jeremyevans0 Thank you for the clarification. I'll try to consider adjusting the docs to reflect the design.

----------------------------------------
Feature #21389: Simplify Set#inspect output
https://bugs.ruby-lang.org/issues/21389#change-115667

* Author: jeremyevans0 (Jeremy Evans)
* Status: Closed
* Assignee: jeremyevans0 (Jeremy Evans)
----------------------------------------
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):

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

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

```ruby
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:

```ruby
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.



-- 
https://bugs.ruby-lang.org/
______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2025-12-14  8:55 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-01  3:36 [ruby-core:122355] [Ruby Feature#21389] Simplify Set#inspect output jeremyevans0 (Jeremy Evans) via ruby-core
2025-06-01 19:55 ` [ruby-core:122363] " Eregon (Benoit Daloze) via ruby-core
2025-06-05  8:47 ` [ruby-core:122437] " matz (Yukihiro Matsumoto) via ruby-core
2025-12-13 18:31 ` [ruby-core:124184] " zverok (Victor Shepelev) via ruby-core
2025-12-14  2:46 ` [ruby-core:124189] " jeremyevans0 (Jeremy Evans) via ruby-core
2025-12-14  8:54 ` [ruby-core:124193] " zverok (Victor Shepelev) via ruby-core

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).