Forum: Ruby-core Inconsistent Array.slice()

Posted by stomar (Marcus Stollsteimer) (Guest)
on 2012-12-11 20:43
(Received via mailing list)
Issue #4541 has been updated by stomar (Marcus Stollsteimer).


Regarding the OP's criticism of poor API documentation, this has in the 
meantime been improved (with issue #6680).

From the current documentation for Array#slice:

  Negative indices count backward from the end of the array (-1 is the 
last
  element).  For +start+ and +range+ cases the starting index is just 
before
  an element.  Additionally, an empty array is returned when the 
starting
  index for an element range is at the end of the array.

  Returns +nil+ if the index (or starting index) are out of range.

  a = [ "a", "b", "c", "d", "e" ]
  a[2] +  a[0] + a[1]    #=> "cab"
  a[6]                   #=> nil
  a[1, 2]                #=> [ "b", "c" ]
  a[1..3]                #=> [ "b", "c", "d" ]
  a[4..7]                #=> [ "e" ]
  a[6..10]               #=> nil
  a[-3, 3]               #=> [ "c", "d", "e" ]
  # special cases
  a[5]                   #=> nil
  a[6, 1]                #=> nil
  a[5, 1]                #=> []
  a[5..10]               #=> []
----------------------------------------
Feature #4541: Inconsistent Array.slice()
https://bugs.ruby-lang.org/issues/4541#change-34633

Author: kbl (Marcin Pietraszek)
Status: Assigned
Priority: Normal
Assignee: matz (Yukihiro Matsumoto)
Category: core
Target version: next minor


=begin
Array slice/[] method is a bit inconsistent. Is it just poorly 
documented "feature" or a bug? In API doc I can't find this behaviour 
mentioned as a "special case".

 def test_array_slice
    array = ['a', 'b', 'c']
    assert_equal nil, array[3]
    assert_eaual nil, array[4]

    assert_eaual [], array[3, 0] #
    assert_equal nil, array[4, 0] # [] expected (or both nils in 
array[3, 0] and array[4, 0])

    assert_equal ['c'], array[2..2]
    assert_equal [], array[3..3] #
    assert_equal nil, array[4..4] # [] expected (or both nils in 
array[3..3] and array[4..4])
 end

Same behaviour can be reproduced on ruby 1.8.7 (2010-12-23 patchlevel 
330) [x86_64-linux].
=end
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.