From: "drbrain (Eric Hodel)" Date: 2012-12-12T01:51:23+09:00 Subject: [ruby-core:50777] [ruby-trunk - Feature #7546] Change behavior of `Array#slice` for an argument of `Range` class Issue #7546 has been updated by drbrain (Eric Hodel). Target version set to Next Major This will break existing code so I set it to next major. ---------------------------------------- Feature #7546: Change behavior of `Array#slice` for an argument of `Range` class https://bugs.ruby-lang.org/issues/7546#change-34627 Author: alexeymuranov (Alexey Muranov) Status: Open Priority: Normal Assignee: Category: core Target version: Next Major =begin This is a concrete proposal to "fix" #4541. It is also related to #7545. For this proposal to make good sense, i think it would be nice if #7545 was at least partially accepted. === Main proposal I propose (({Array#slice})) with (({Range})) type argument to work as follows: a = ['0', '1', '2', '3'] a[1..2] # => ['1', '2'] a[-2..-1] # => ['2', '3'] a[2..1] # => ['2', '1'] a[-1..-2] # => ['3', '2'] a[-1..1] # => ['3', '0', '1'] a[1..-1] # => ['1', '0', '3'] a[1..1] # => ['1'] a[1...1] # => [] a[4..4] # => [nil] a[4...4] # => [] a[9..9] # => [nil] a[9...9] # => [] a[1..5] # => ['1', '2', '3', nil, nil] === Secondary proposal: consider adding new instance methods to (({Array})) to compensate the changed behavior of (({Array#slice})) If this proposal is accepted, the code "(({a[1..-2]}))" for an array (({a})) will not work as before. This can be compensated by adding new instance methods to (({Array})). For example the following ones. 1. (({Array#clip(fixnum, fixnum)})): ['0', '1', '2', '3'].clip(1, 1) # => ['1', '2'] Thus (({a.clip(1, 1)})) would be a replacement for (({a[1..-2]})). (It looks strange to have to convert a pair of numbers ((*m*)) and ((*n*)) into a range (({m..(-1-n)})) to simply ask an array to remove ((*m*)) elements from the beginning and ((*n*)) elements from the end. If #7545 is accepted, then the "(({a[1..-2]}))" syntax for "clipping" an array will make not much sense and maybe will not be possible.) 2. (({Array#from(fixnum)})), (({Array#till(fixnum)})): a = ['0', '1', '2', '3'] a.from(1) # => ['1', '2', '3'] a.till(1) # => ['0', '1'] a.from(1).till(-2) # => ['1', '2'] In fact, in ((*Rails*)) (({ActiveSupport})) there are methods (({Array#from})) and (({Array#to})) like this, but unfortunately they do not accept negative indices. ((*Remark*)). It would also be possible to have (({Array#clip!})), (({Array#from!})), (({Array#till!})). =end -- http://bugs.ruby-lang.org/