Ruby: How to grow or shrink an array to a given size

If you want to grow a Ruby Array, you might find out about #fill but it is not really what you are looking for. [1]
For arrays of unknown size that you want to grow or shrink to a fixed size, you need to define something yourself. Like the following.

Array.class_eval do

  def in_size(expected_size, fill_with = nil)
    sized = self[0, expected_size]
    sized << fill_with while sized.size < expected_size
    sized
  end

end

Use it like this:

>> [1, 2, 3].in_size(5)
=> [1, 2, 3, nil, nil]
>> [1, 2, 3, 4, 5, 6, 7].in_size(5)
=> [1, 2, 3, 4, 5]

Attached you will find the above method definition of #in_size. Put it in where your monkey-patches live.
You will also find a spec that goes along with it.


[1] Array#fill does the job but is really meant for writing ranges inside an array. Its syntax is a bit weird to use for growing (e.g. to get from [1, 2, 3] to [1, 2, 3, "foo", "foo"] you have to say [1, 2, 3].fill("foo", 3..4) or [1, 2, 3].fill("foo", 3, 2) which are both equally odd-looking) and while we could use it inside our #in_size method it would not make things easier.

Arne Hartherz Almost 9 years ago