class Range
Redefine a method {#==} so as to handle a comparison with {Rangesmaller}.¶ ↑
Public Instance Methods
When compared with either {Rangesmaller} object, it will deal with it. For each element, that is, {#begin} and {#end}, this uses ==() method of each element. See {#eql?}.
# File lib/rangesmaller/rangesmaller.rb, line 585 def ==(r) equal_core(r, :==, :equal_prerangesmaller?) end
Returns true if self is empty, namely, there is no possible member, and if it is still valid. If it is not valid, it returns nil. Otherwise, false.
Examples¶ ↑
(nil..nil).empty? # => nil Rangesmaller(1..2).empty? # => false Rangesmaller(1...2).empty? # => nil Rangesmaller(1...2, :exclude_begin => true).empty? => true Rangesmaller(1.0...2, :exclude_begin => true).empty? => true Rangesmaller(1...2, :exclude_begin => true).empty? => true Rangesmaller(1.0...2, :exclude_begin => true).empty? => false Rangesmaller(?a...?b, :exclude_begin => true).empty? => true RangeOpen::NONE.empty? # => true
@note to check whether it is either empty or invalid, use {#null?}.
See {#valid?}, too.
# File lib/rangesmaller/rangesmaller.rb, line 667 def empty? if !valid? return nil elsif defined?(self.is_none?) && self.is_none? return true end t = (self.begin() <=> self.end()) case t when -1 if (defined?(self.exclude_begin?)) && exclude_begin? && exclude_end? && defined?(self.begin().succ) && (self.begin().succ == self.end()) true # e.g., ("a"<..."b") else false end when 0 if defined?(self.boundary) && self.boundary.nil? # RangeOpen::NONE or RangeOpen::All if self.exclude_end? true # RangeOpen::Null else false # RangeOpen::All end else if defined?(self.exclude_begin?) t2 = self.exclude_begin? else t2 = false end (t2 && exclude_end?) end when 1 nil else nil # eg. (nil..nil) end end
Same as {#==}, but the comparison is made with eql?() method.
# File lib/rangesmaller/rangesmaller.rb, line 593 def eql?(r) equal_core(r, :eql?, :eql_prerangesmaller?) end
Returns true if it is either empty or invalid. See {#empty?} and {#valid?}.
# File lib/rangesmaller/rangesmaller.rb, line 712 def null? (! valid?) || empty? end
Returns true if self is valid as a Range
(or Rangesmaller
or RangeOpen), even if it is empty. To construct a valid range, the elements have to be Comparable, and {#end} is larger than, or equal to, {#begin}.
Examples¶ ↑
(nil..nil).valid? # => false (0..0).valid? # => true (0...0).valid? # => false (2..-1).valid? # => false Rangesmaller(0...0, :exclude_begin => false) # => false Rangesmaller(0...0, :exclude_begin => true) # => true RangeOpen::NONE.valid? #=> true RangeOpen(5).valid? #=> true RangeOpen::ALL.valid? #=> true
See {#empty?} and {#null?}
# File lib/rangesmaller/rangesmaller.rb, line 615 def valid? if defined?(self.is_none?) && self.is_none? return true end begin t = (self.begin() <=> self.end()) rescue NoMethodError false # return else case t when -1 true when 0 if is_comparable?(self.begin()) if defined?(self.exclude_begin?) t = self.exclude_begin? else t = false end (t ^! exclude_end?) # True if single value or empty. else false # Not Comparable; eg., nil..nil end when 1 false else false # Not Comparable. end # All statements of return above. end end
Private Instance Methods
@param r [Object] to compare. @param method [Symbol] of the method name. @param method_pre [Symbol] of the backed-up original method name.
# File lib/rangesmaller/rangesmaller.rb, line 733 def equal_core(r, method, method_pre) if ! defined? r.exclude_end? false # Not Range family. elsif defined? r.exclude_begin? # Either Rangesmaller or RangeOpen object. if r.exclude_begin? false # self(Range) has always the inclusive begin. else # It could do with a single line, # self.begin.send(method_pre, r) # if this was for Rangesmaller===r, but not for RangeOpen. if (self.exclude_end? ^ r.exclude_end?) false elsif (self.begin.send(method, r.begin) && self.end.send(method, r.end)) true else false end end else self.send(method_pre, r) # r is Range. end end
True if obj is Comparable.
# File lib/rangesmaller/rangesmaller.rb, line 722 def is_comparable?(obj) if defined?(obj.<=) # Comparable? true else false end end