class Set

The Set class implements a collection of unordered values with no duplicates. It is a hybrid of Array’s intuitive inter-operation facilities and Hash’s fast lookup.

Set is easy to use with Enumerable objects (implementing each). Most of the initializer methods and binary operators accept generic Enumerable objects besides sets and arrays. An Enumerable object can be converted to Set using the to_set method.

Set uses a data structure similar to Hash for storage, except that it only has keys and no values.

Comparison

The comparison operators <, >, <=, and >= are implemented as shorthand for the {proper_,}{subset?,superset?} methods. The <=> operator reflects this order, or returns nil for sets that both have distinct elements ({x, y} vs. {x, z} for example).

Example

s1 = Set[1, 2]                        #=> Set[1, 2]
s2 = [1, 2].to_set                    #=> Set[1, 2]
s1 == s2                              #=> true
s1.add("foo")                         #=> Set[1, 2, "foo"]
s1.merge([2, 6])                      #=> Set[1, 2, "foo", 6]
s1.subset?(s2)                        #=> false
s2.subset?(s1)                        #=> true

Contact

Inheriting from Set

Before Ruby 4.0 (released December 2025), Set had a different, less efficient implementation. It was reimplemented in C, and the behavior of some of the core methods were adjusted.

To keep backward compatibility, when a class is inherited from Set, additional module Set::SubclassCompatible is included, which makes the inherited class behavior, as well as internal method names, closer to what it was before Ruby 4.0.

It can be easily seen, for example, in the inspect method behavior:

p Set[1, 2, 3]
# prints "Set[1, 2, 3]"

class MySet < Set
end
p MySet[1, 2, 3]
# prints "#<MySet: {1, 2, 3}>", like it was in Ruby 3.4

For new code, if backward compatibility is not necessary, it is recommended to instead inherit from Set::CoreSet, which avoids including the “compatibility” layer:

class MyCoreSet < Set::CoreSet
end
p MyCoreSet[1, 2, 3]
# prints "MyCoreSet[1, 2, 3]"

Set’s methods

First, what’s elsewhere. Class Set:

In particular, class Set does not have many methods of its own for fetching or for iterating. Instead, it relies on those in Enumerable.

Here, class Set provides methods that are useful for:

Methods for Creating a Set

Methods for Set Operations

Methods for Comparing

Methods for Querying

Methods for Assigning

Methods for Deleting

Methods for Converting

Methods for Iterating

Other Methods