symbols_and_ranges/allocated_range_parens.rb

tests/_examples/symbols_and_ranges/allocated_range_parens.rb in the metorex repository.

# A range written as a literal is frozen the moment it is made, so the only
# range whose ends can still be written is one `allocate` handed back.
held = Range.allocate
held.send(:initialize, 3, 7, true)

p(held.begin)
p(held.end)
p(held.exclude_end?)

# Both ends have to be comparable with each other.
begin
  Range.allocate.send(:initialize, Object.new, Object.new)
rescue ArgumentError => error
  puts(error.message)
end

# A range that is already built refuses to be written again.
begin
  (0..1).send(:initialize, 1, 3)
rescue FrozenError => error
  puts(error.class)
end

Output:

3
7
true
bad value for range
FrozenError