Project

General

Profile

Feature #17208

Add `Set#compact` and `Set#compact!` methods

Added by koic (Koichi ITO) about 2 months ago. Updated 25 days ago.

Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:100259]

Description

This is a proposal to add compact and compact! methods already owned by Array and Hash to Set.

  • Array#compact and Array#compact! has been around for a long time.
  • Hash#compact has Hash#compact! been added since Ruby 2.4 ... https://bugs.ruby-lang.org/issues/11818
  • There is Set in collection libraries other than Array and Hash. But Set doesn't have compact and compact! methods.

It behaves the same as compact and compact! methods of Array and Hash as follows.

Set#compact!:

# Removes all nil elements from self. Returns self if any elements removed, otherwise nil.
set = Set[1, 'c', nil]            #=> #<Set: {1, "c", nil}>
set.compact!                      #=> #<Set: {1, "c"}>
set                               #=> #<Set: {1, "c"}>

set = Set[1, 'c']                 #=> #<Set: {1, "c"}>
set.compact!                      #=> nil
set                               #=> #<Set: {1, "c"}>

Set#compact:

# Returns a new Set containing all non-nil elements from self.
set = Set[1, 'c', nil]            #=> #<Set: {1, "c", nil}>
set.compact                       #=> #<Set: {1, "c"}>
set                               #=> #<Set: {1, "c", nil}>

set = Set[1, 'c']                 #=> #<Set: {1, "c"}>
set.compact                       #=> #<Set: {1, "c"}>
set                               #=> #<Set: {1, "c"}>

Pull Request ... https://github.com/ruby/ruby/pull/3617

Updated by shyouhei (Shyouhei Urabe) about 2 months ago

I like the feature, but isn't "Compact Set" a mathematical concept that refers to something different?

Updated by marcandre (Marc-Andre Lafortune) about 2 months ago

shyouhei (Shyouhei Urabe) wrote in #note-2:

I like the feature, but isn't "Compact Set" a mathematical concept that refers to something different?

It can, but the idea requires infinite sets, and all elements belonging to a topological space, I doubt many people would actually be confused.

Updated by bozhidar (Bozhidar Batsov) 25 days ago

I like the proposal. I also wonder if we shouldn't be able to able to reject nils at Set creation time, as nil rarely makes sense as a set value.

Updated by Eregon (Benoit Daloze) 25 days ago

bozhidar (Bozhidar Batsov) wrote in #note-4:

I like the proposal. I also wonder if we shouldn't be able to able to reject nils at Set creation time, as nil rarely makes sense as a set value.

With some option then?

I believe generic collections should accept any element, no special handling of nil or any other object.
(there might be additional requirements like #hash/#eql?, but any object can implement them)

Also available in: Atom PDF