I just stumbled upon this behaviour while specifying Array methods for
Rubinius:
irb(main):001:0> ary = [1, 2]
=> [1, 2]
irb(main):002:0> ary.slice!(100)
=> nil
irb(main):003:0> ary
=> [1, 2]
irb(main):004:0> ary.slice!(100, 0)
=> nil
irb(main):005:0> ary
=> [1, 2, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
nil, nil]
Is this intended behaviour? I'd expect .slice!() with an index and an
index and a length to behave consistently. (I'd also expect
Array#slice!() not to increase the size of the Array.)
It also happens with a range, btw:
irb(main):001:0> ary = [1, 2]
=> [1, 2]
irb(main):002:0> ary.slice!(100...100)
=> nil
irb(main):003:0> ary
=> [1, 2, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
nil, nil]
I'm seeing this in ruby 1.8.4 (2005-12-24) and ruby 1.9.0 (2007-04-02
patchlevel 0).
The documentation says that is equivalent to this Ruby code:
def slice!(*args)
result = self[*args]
self[*args] = nil
result
end
If that were the case slice!(100) would also expand the Array.
Kind regards,
Florian Gross