[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Array resizing

Victor 'Zverok' Shepelev

3/28/2006 12:41:00 PM

Maybe dumb question, but...

I have not found anything like Array.resize, i.e.

a = [1,2]

a.resize(5) #=> [1,2,nil,nil,nil]
a.resize(5, 3) #=> [1,2,3,3,3]

I can use Array.fill, but

a.fill(3, a.size, a.size+2)

looks a bit ugly, not?

Moreover, if I want to resize to size lesser then array is, I need slice.

Why not to have all-purpose resize?

Victor.



6 Answers

Pierre Barbier de Reuille

3/28/2006 12:54:00 PM

0

Victor Shepelev a écrit :
> Maybe dumb question, but...
>
> I have not found anything like Array.resize, i.e.
>
> a = [1,2]
>
> a.resize(5) #=> [1,2,nil,nil,nil] a.resize(5, 3) #=> [1,2,3,3,3]
>
>
> I can use Array.fill, but
>
> a.fill(3, a.size, a.size+2)
>
> looks a bit ugly, not?
>
> Moreover, if I want to resize to size lesser then array is, I need
> slice.
>
> Why not to have all-purpose resize?
>
> Victor.
>
You may try :

a = [1,2]
a.fill(3, -1, 3) #=> [1,2,3,3,3]

So you may code yourself your resize :

class Array
def resize(new_size, value=nil)
if new_size < length
slice!(new_size, length)
else
fill(value, -1, new_size-length)
end
self
end
end

Pierre




Marcin Mielzynski

3/28/2006 1:00:00 PM

0

Victor Shepelev wrote:
> Maybe dumb question, but...
>
> I have not found anything like Array.resize, i.e.
>
> a = [1,2]
>
> a.resize(5) #=> [1,2,nil,nil,nil]
> a.resize(5, 3) #=> [1,2,3,3,3]
>
> I can use Array.fill, but
>
> a.fill(3, a.size, a.size+2)
>
> looks a bit ugly, not?
>

a = [1,2,3]
a += [nil] * 3

> Moreover, if I want to resize to size lesser then array is, I need slice.
>

a = [1,2,3,4,5]
a[0..-3]

Ruby 1.9 supports Array#pop taking an integer

lopex

Marcin Mielzynski

3/28/2006 1:03:00 PM

0

Pierre Barbier de Reuille wrote:

>
> a = [1,2]
> a.fill(3, -1, 3) #=> [1,2,3,3,3]
>

nope:

a = [1,2]
a.fill(3, -1, 3) #=> [1,3,3,3]


since -1 points to the last value in an array


lopex

Victor 'Zverok' Shepelev

3/28/2006 1:16:00 PM

0

Pierre wrote

> So you may code yourself your resize :
>
> class Array
> def resize(new_size, value=nil)
> if new_size < length
> slice!(new_size, length)
> else
> fill(value, -1, new_size-length)
> end
> self
> end
> end

Yes, I can (in fact, I already did).

The question is more ideological than technical. Why not to have
Array#resize in standard library? It seems not very rational.

> Pierre

Victor.



dblack

3/28/2006 1:23:00 PM

0

Victor 'Zverok' Shepelev

3/28/2006 1:56:00 PM

0

David wrote:

> > The question is more ideological than technical. Why not to have
> > Array#resize in standard library? It seems not very rational.
>
> I think it might be because the size of an array isn't important if
> the array just contains nils, because uninitialized values default to
> nil anyway. And if you're adding non-nil elements to the array, then
> the fact that the size changes is not really the main point; it's just
> a side-effect of the operation, so referring to it as a "resize"
> operation doesn't fit very well.

Sounds reasonable.
I can tell when I stumbled upon need for __resizing__ aray: when tried to
use Array#transpose - it can't process
[
[1,2,3],
[1],
[1,2,3,4]
]

I think, it isn't sole case, when we can want having array of arbitrary
size.

> David

Victor.