Project

General

Profile

Feature #7545

Make Range act as a "lazy ordered set"

Added by alexeymuranov (Alexey Muranov) almost 8 years ago. Updated almost 8 years ago.

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

Description

=begin

Make Range act as a "lazy ordered set"

This replaces my older feature request #5534.

I propose the following new behavior of (({Range})):

(1..3).to_a # => 1, 2, 3.to_a # => [3, 2, 1]
'a'..'c'.to_a # => ['a', 'b', 'c']
'c'..'a'.to_a # => ['c', 'b', 'a']
1...1 == 3...3 # => true
1...1 == 'a'...'a' # => true
1...1 == Range::EMPTY_SET # => true
1..2 == 1...3 # => false
1...3.include?(2.5) # => true

Also, maybe in the future the following behavior can be possible:

r1 = Range.new('a', 'bc', :deglex)
r1.include?('abc') # => false
r1.to_a # => ['a', 'b', ..., 'az', 'ba', 'bb', 'bc']
r2 = Range.new('a', 'bc', :lex)
r2.include?('abc') # => true
r2.to_a # => Error

and this:

((0.5)..(5.5)).to_a(Integer) # => 1, 2, 3, 4, 5.each(Integer) do |i| puts i end

(i imagine this would require additions to the (({Integer})) class, so that it
know more about "real" ranges).

=end

Also available in: Atom PDF