module Set::SubclassCompatible
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.
Public Class Methods
Source
# File 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}>
Public Instance Methods
Source
# File 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
Also aliased as: intersection
Source
# File lib/set/subclass_compatible.rb, line 257 def -(enum) dup.subtract(enum) end
Also aliased as: difference
Source
# File 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
Source
# File 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
Calls superclass method
Source
# File 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
Source
# File lib/set/subclass_compatible.rb, line 251 def |(enum) dup.merge(enum) end
Source
# File lib/set/subclass_compatible.rb, line 190 def add?(o) add(o) unless include?(o) end
Source
# File 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
Source
# File 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
Also aliased as: map!
Source
# File lib/set/subclass_compatible.rb, line 194 def delete?(o) delete(o) if include?(o) end
Source
# File 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
Source
# File lib/set/subclass_compatible.rb, line 186 def disjoint?(set) !intersect?(set) end
Source
# File lib/set/subclass_compatible.rb, line 105 def flatten self.class.new.flatten_merge(self) end
Source
# File lib/set/subclass_compatible.rb, line 109 def flatten! replace(flatten()) if any?(Set) end
Source
# File 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, …}>”).
Also aliased as: to_s
Source
# File 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
Source
# File lib/set/subclass_compatible.rb, line 312 def join(separator=nil) to_a.join(separator) end
Source
# File 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
Source
# File 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
Calls superclass method
Source
# File 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
Calls superclass method
Also aliased as: <
Source
# File 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
Calls superclass method
Also aliased as: >
Source
# File 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
Source
# File 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
Calls superclass method
Source
# File 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
Also aliased as: filter!
Source
# File 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
Calls superclass method
Also aliased as: <=
Source
# File lib/set/subclass_compatible.rb, line 246 def subtract(enum) do_with_enum(enum) { |o| delete(o) } self end
Source
# File 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
Calls superclass method
Also aliased as: >=
Source
# File 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