Feature #7580
openRange translation
Description
=begin
I would like to propose the (({#+})) and (({#-})) methods on (({Range})).
These would be useful for translating ranges - for example, given a range where the endpoints are 1-indexed, the range could be translated by 1 in the negative direction to use in (({Array#[]})).
Instead of doing a syntactically-bulky manual translation like so:
ary[(range.begin - 1)..(range.end - 1)]
(({Range#-})) could be used instead:
ary[range - 1]
The translation methods would not handle certain endpoint types specially, they would just pass the call on.
Here's an example implementation in Ruby:
class Range
def +(other)
Range.new(self.begin + other, self.end + other, exclude_end?)
end
def -(other)
Range.new(self.begin - other, self.end - other, exclude_end?)
end
end
=end
Updated by naruse (Yui NARUSE) almost 12 years ago
I think such arithmetic is not addition/subtraction, but shift.
Updated by Anonymous almost 12 years ago
=begin
Do you propose that (({Range#<<})) would use (({#-})) and (({Range#>>})) would use (({#+})), or would it be a different method call internally?
I am happy with both alternatives, I just want nice convenience methods for this operation.
=end
Updated by dummey (Ricky Ng) almost 12 years ago
I would normally agree that 'shift' would be the proper term except that it's used in Array already which could cause a bit of confusion.
Updated by naruse (Yui NARUSE) almost 12 years ago
- Status changed from Open to Assigned
- Assignee set to matz (Yukihiro Matsumoto)
charliesome (Charlie Somerville) wrote:
Do you propose that (({Range#<<})) would use (({#-})) and (({Range#>>})) would use (({#+})), or would it be a different method call internally?
Don't use +/- and use <</>> or Range#shift().
I am happy with both alternatives, I just want nice convenience methods for this operation.
In my experience, such alternative name considered harmful
because if you want to add another method as Arange#+ in the future, those aliases prevent it.
Updated by Anonymous almost 12 years ago
- Target version set to 2.6
Updated by DanielRHeath (Daniel Heath) over 6 years ago
Duplicated at https://bugs.ruby-lang.org/issues/14777
Agree that '+' seems an idiomatic name (I'm using ranges to represent coordinate ranges for bounding boxes).
It's somewhat awkward given that a Range can be eg ('a'..'z') - should ('a'..'z') + 'b'
return ('ab'..'zb')
?
Updated by DanielRHeath (Daniel Heath) over 6 years ago
On the other hand, +
could easily be construed to construct non-contiguous ranges (eg ((1..2) + (4..5)).to_a == [1,2,4,5]
.