[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Loop over an array that changes the elements

Bernd Burnt

7/13/2007 11:40:00 AM

Hi,

I have a rather simple question. I have an array and want to change the
elements of the array in a loop. For example in Java, you would write:

int[] numbers = {1, 2, 3}

for(int i = 0; i < numbers.length; i++)
{
numbers[i] = numbers[i] * 2
}


In Ruby the common way to loop over an array is Array#each

But

numbers = [1, 2, 3]

numbers.each do |num|
num = num * 2
end

would not change the array itself.

Of course, you can write something like

for i in 0 .. numbers.length-1 do
numbers[i] = numbers * 2
end

But this in my eyes is not really the Ruby way. Is there a standard way
of doing this?

Thx a lot!

--
Posted via http://www.ruby-....

7 Answers

Robert Dober

7/13/2007 11:53:00 AM

0

On 7/13/07, Bernd Burnt <djbearhand@gmx.de> wrote:
> Hi,
>
> I have a rather simple question. I have an array and want to change the
> elements of the array in a loop. For example in Java, you would write:
>
> int[] numbers = {1, 2, 3}
>
> for(int i = 0; i < numbers.length; i++)
> {
> numbers[i] = numbers[i] * 2
> }
>
numbers.map!{ |x| x*2 }
HTH
Robert
>
> In Ruby the common way to loop over an array is Array#each
>
> But
>
> numbers = [1, 2, 3]
>
> numbers.each do |num|
> num = num * 2
> end
>
> would not change the array itself.
No it would point num to a new Integer simply, you can only change the
objects num refers to, but in our case as these objects are immutable
Integers it wont work.
Consider Strings which are muteable in ruby, and try this code ( best in irb )
letters=%w{a b c}
letters.each do | letter |
letter << "*"
end

Still I prefer
letters.map{ |l| l << "*" }
although
letters.map!{ |l| l + "*" }
is probably much cleaner code :)

HTH
Robert
>
> Of course, you can write something like
>
> for i in 0 .. numbers.length-1 do
> numbers[i] = numbers * 2
> end

>
> But this in my eyes is not really the Ruby way. Is there a standard way
> of doing this?
Well spotted Bernd ;)
>
> Thx a lot!
>
> --
> Posted via http://www.ruby-....
>
>

HTH
Robert
--
I always knew that one day Smalltalk would replace Java.
I just didn't know it would be called Ruby
-- Kent Beck

benjohn

7/13/2007 12:53:00 PM

0

> Hi,
>
> I have a rather simple question. I have an array and want to change the
> elements of the array in a loop. For example in Java, you would write:
>
> int[] numbers = {1, 2, 3}
>
> for(int i = 0; i < numbers.length; i++)
> {
> numbers[i] = numbers[i] * 2
> }
>
>
> In Ruby the common way to loop over an array is Array#each
>
> But
>
> numbers = [1, 2, 3]
>
> numbers.each do |num|
> num = num * 2
> end
>
> would not change the array itself.
>
> Of course, you can write something like
>
> for i in 0 .. numbers.length-1 do
> numbers[i] = numbers * 2
> end
>
> But this in my eyes is not really the Ruby way. Is there a standard way
> of doing this?

numbers = numbers.map {|number| numer * 2}

Cheers,
B


benjohn

7/13/2007 12:58:00 PM

0

> Hi,
>
> I have a rather simple question. I have an array and want to change the
> elements of the array in a loop. For example in Java, you would write:
>
> int[] numbers = {1, 2, 3}
>
> for(int i = 0; i < numbers.length; i++)
> {
> numbers[i] = numbers[i] * 2
> }
>
>
> In Ruby the common way to loop over an array is Array#each
>
> But
>
> numbers = [1, 2, 3]
>
> numbers.each do |num|
> num = num * 2
> end
>
> would not change the array itself.

You're right.

As others and I have said, the map solution is good here.

numbers = numbers.map {|number| number*2}

If you really wanted to change the array itself though, you could do this:

numbers.each_index {|i| numbers[i] = numbers[i] * 2}

or

numbers.each_index {|i| numbers[i] *= 2}

Thanks,
Benj


Xavier Noria

7/13/2007 12:59:00 PM

0

El Jul 13, 2007, a las 2:53 PM, benjohn@fysh.org escribió:

> numbers = numbers.map {|number| numer * 2}

Even, to be closer to the in-place editing,

numbers.map! {|n| n*2}

-- fxn


Robert Dober

7/13/2007 1:00:00 PM

0

On 7/13/07, benjohn@fysh.org <benjohn@fysh.org> wrote:
> > Hi,
> >
> > I have a rather simple question. I have an array and want to change the
> > elements of the array in a loop. For example in Java, you would write:
> >
> > int[] numbers = {1, 2, 3}
> >
> > for(int i = 0; i < numbers.length; i++)
> > {
> > numbers[i] = numbers[i] * 2
> > }
> >
> >
> > In Ruby the common way to loop over an array is Array#each
> >
> > But
> >
> > numbers = [1, 2, 3]
> >
> > numbers.each do |num|
> > num = num * 2
> > end
> >
> > would not change the array itself.
> >
> > Of course, you can write something like
> >
> > for i in 0 .. numbers.length-1 do
> > numbers[i] = numbers * 2
> > end
> >
> > But this in my eyes is not really the Ruby way. Is there a standard way
> > of doing this?
>
> numbers = numbers.map {|number| numer * 2}
Hmm what about the GC?
>
> Cheers,
> B
>
>
>


--
I always knew that one day Smalltalk would replace Java.
I just didn't know it would be called Ruby
-- Kent Beck

Daniel Martin

7/13/2007 1:16:00 PM

0

benjohn@fysh.org writes:

> As others and I have said, the map solution is good here.
>
> numbers = numbers.map {|number| number*2}
>
> If you really wanted to change the array itself though, you could do this:
>
> numbers.each_index {|i| numbers[i] = numbers[i] * 2}

Actually, as I think someone already posted, map! is probably the most
idiomatic way of doing this:

numbers.map! {|x| 2*x}

--
s=%q( Daniel Martin -- martin@snowplow.org
puts "s=%q(#{s})",s.to_a.last )
puts "s=%q(#{s})",s.to_a.last

Robert Dober

7/13/2007 1:25:00 PM

0

On 7/13/07, Daniel Martin <martin@snowplow.org> wrote:
<snip>
>
> Actually, as I think someone already posted, map! is probably the most
> idiomatic way of doing this:

Daniel this is great I am *not* in your killfile :)

Robert
--
I always knew that one day Smalltalk would replace Java.
I just didn't know it would be called Ruby
-- Kent Beck