This module is automatically included in subclasses of Set, to make them backwards compatible with the pure-Ruby set implementation used before Ruby 4. Users who want to use Set subclasses without this compatibility layer should subclass from Set::CoreSet.
Note that Set subclasses that access @hash are not compatible even with this support. Such subclasses must be updated to support Ruby 4.
Constants
No documentation available
Class Methods
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 41
def initialize(enum = nil, &block) # :yields: o
enum.nil? and return
if block
do_with_enum(enum) { |o| add(block[o]) }
else
merge(enum)
end
end
Creates a new set containing the elements of the given enumerable object.
If a block is given, the elements of enum are preprocessed by the given block.
Set.new([1, 2]) #=> #<Set: {1, 2}> Set.new([1, 2, 1]) #=> #<Set: {1, 2}> Set.new([1, 'c', :s]) #=> #<Set: {1, "c", :s}> Set.new(1..5) #=> #<Set: {1, 2, 3, 4, 5}> Set.new([1, 2, 3]) { |x| x * x } #=> #<Set: {1, 4, 9}>
Instance Methods
#
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 262
def &(enum)
n = self.class.new
if enum.is_a?(Set)
if enum.size > size
each { |o| n.add(o) if enum.include?(o) }
else
enum.each { |o| n.add(o) if include?(o) }
end
else
do_with_enum(enum) { |o| n.add(o) if include?(o) }
end
n
end
No documentation available
#
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 257
def -(enum)
dup.subtract(enum)
end
No documentation available
#
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 161
def <=>(set)
return unless set.is_a?(Set)
case size <=> set.size
when -1 then -1 if proper_subset?(set)
when +1 then +1 if proper_superset?(set)
else 0 if self.==(set)
end
end
No documentation available
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 283
def ==(other)
if self.equal?(other)
true
elsif other.instance_of?(self.class)
super
elsif other.is_a?(Set) && self.size == other.size
other.all? { |o| include?(o) }
else
false
end
end
No documentation available
#
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 277
def ^(enum)
n = self.class.new(enum)
each { |o| n.add(o) unless n.delete?(o) }
n
end
No documentation available
#
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 251
def |(enum)
dup.merge(enum)
end
No documentation available
#
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 190
def add?(o)
add(o) unless include?(o)
end
No documentation available
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 300
def classify
block_given? or return enum_for(__method__) { size }
h = {}
each { |i|
(h[yield(i)] ||= self.class.new).add(i)
}
h
end
No documentation available
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 210
def collect!
block_given? or return enum_for(__method__) { size }
set = self.class.new
each { |o| set << yield(o) }
replace(set)
end
No documentation available
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 194
def delete?(o)
delete(o) if include?(o)
end
No documentation available
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 198
def delete_if(&block)
block_given? or return enum_for(__method__) { size }
select(&block).each { |o| delete(o) }
self
end
No documentation available
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 186
def disjoint?(set)
!intersect?(set)
end
No documentation available
#
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 105
def flatten
self.class.new.flatten_merge(self)
end
No documentation available
#
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 109
def flatten!
replace(flatten()) if any?(Set)
end
No documentation available
#
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 320
def inspect
ids = (Thread.current[InspectKey] ||= [])
if ids.include?(object_id)
return sprintf('#<%s: {...}>', self.class.name)
end
ids << object_id
begin
return sprintf('#<%s: {%s}>', self.class, to_a.inspect[1..-2])
ensure
ids.pop
end
end
Returns a string containing a human-readable representation of the set (“#<Set: {element1, element2, …}>”).
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 171
def intersect?(set)
case set
when Set
if size < set.size
any?(set)
else
set.any?(self)
end
when Enumerable
set.any?(self)
else
raise ArgumentError, "value must be enumerable"
end
end
No documentation available
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 312
def join(separator=nil)
to_a.join(separator)
end
No documentation available
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 204
def keep_if(&block)
block_given? or return enum_for(__method__) { size }
reject(&block).each { |o| delete(o) }
self
end
No documentation available
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 234
def merge(*enums, **nil)
enums.each do |enum|
if enum.instance_of?(self.class)
super(enum)
else
do_with_enum(enum) { |o| add(o) }
end
end
self
end
No documentation available
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 149
def proper_subset?(set)
case
when set.instance_of?(self.class)
super
when set.is_a?(Set)
size < set.size && all?(set)
else
raise ArgumentError, "value must be a set"
end
end
No documentation available
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 125
def proper_superset?(set)
case
when set.instance_of?(self.class)
super
when set.is_a?(Set)
size > set.size && set.all?(self)
else
raise ArgumentError, "value must be a set"
end
end
No documentation available
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 218
def reject!(&block)
block_given? or return enum_for(__method__) { size }
n = size
delete_if(&block)
self if size != n
end
No documentation available
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 62
def replace(enum)
if enum.instance_of?(self.class)
super
else
do_with_enum(enum) # make sure enum is enumerable before calling clear
clear
merge(enum)
end
end
No documentation available
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 225
def select!(&block)
block_given? or return enum_for(__method__) { size }
n = size
keep_if(&block)
self if size != n
end
No documentation available
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 137
def subset?(set)
case
when set.instance_of?(self.class)
super
when set.is_a?(Set)
size <= set.size && all?(set)
else
raise ArgumentError, "value must be a set"
end
end
No documentation available
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 246
def subtract(enum)
do_with_enum(enum) { |o| delete(o) }
self
end
No documentation available
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 113
def superset?(set)
case
when set.instance_of?(self.class)
super
when set.is_a?(Set)
size >= set.size && set.all?(self)
else
raise ArgumentError, "value must be a set"
end
end
No documentation available
4.0
View on GitHub
# File tmp/rubies/ruby-4.0.0/lib/set/subclass_compatible.rb, line 72
def to_set(*args, &block)
klass = if args.empty?
Set
else
warn "passing arguments to Enumerable#to_set is deprecated", uplevel: 1
args.shift
end
return self if instance_of?(Set) && klass == Set && block.nil? && args.empty?
klass.new(self, *args, &block)
end
No documentation available