Array#slice!() expands array inconsistently

0 views
Skip to first unread message

Florian Gross

unread,
Jun 15, 2007, 10:02:30 AM6/15/07
to ruby...@ruby-lang.org
Hi,

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


Reply all
Reply to author
Forward
0 new messages