From: "drbrain (Eric Hodel)" Date: 2012-12-12T01:44:17+09:00 Subject: [ruby-core:50775] [ruby-trunk - Feature #7545] Make Range act as a "lazy ordered set" Issue #7545 has been updated by drbrain (Eric Hodel). Target version set to Next Major =begin How would (({(3..1).to_a})) be implemented? The opposite uses #succ today. Why should (({1...1})) equal (({3...3}))? I don't understand at all. This would break existing code. In (({1...3.include?(2.5)})) is the change to Ruby syntax also part of the proposal, or a typo? (Currently NoMethodError is raised due to low precedence of (({...}). Is there something wrong with Range#cover? What is a deglex? What is a lex? =end ---------------------------------------- Feature #7545: Make Range act as a "lazy ordered set" https://bugs.ruby-lang.org/issues/7545#change-34625 Author: alexeymuranov (Alexey Muranov) Status: Open Priority: Normal Assignee: Category: core Target version: Next Major =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] (3..1).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] ((0.5)..(5.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 -- http://bugs.ruby-lang.org/