Feature #7580

Range translation

Added by Charlie Somerville over 1 year ago. Updated about 1 year ago.

[ruby-core:50936]
Status:Assigned
Priority:Normal
Assignee:Yukihiro Matsumoto
Category:-
Target version:next minor

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

History

#1 Updated by Yui NARUSE over 1 year ago

I think such arithmetic is not addition/subtraction, but shift.

#2 Updated by Charlie Somerville over 1 year 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

#3 Updated by Ricky Ng over 1 year 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.

#4 Updated by Yui NARUSE over 1 year ago

  • Status changed from Open to Assigned
  • Assignee set to 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.

#5 Updated by Charlie Somerville about 1 year ago

  • Target version set to next minor

Also available in: Atom PDF