[prev in list] [next in list] [prev in thread] [next in thread] 

List:       ruby-core
Subject:    Array#slice!() expands array inconsistently
From:       Florian Gross <florgro () gmail ! com>
Date:       2007-06-15 14:02:30
Message-ID: 1181916148.639845.296730 () q66g2000hsg ! googlegroups ! com
[Download RAW message or body]

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


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic