Loop over an array that changes the elements

B

Bernd Burnt

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 = numbers * 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 = 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!
 
R

Robert Dober

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 = numbers * 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 = 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!

HTH
Robert
 
B

benjohn

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 = numbers * 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 = 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
 
B

benjohn

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 = numbers * 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 = numbers * 2}

or

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

Thanks,
Benj
 
X

Xavier Noria

El Jul 13, 2007, a las 2:53 PM, (e-mail address removed) escribi=F3:
numbers =3D numbers.map {|number| numer * 2}

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

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

-- fxn
 
R

Robert Dober

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 = numbers * 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 = 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
 
D

Daniel Martin

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 = numbers * 2}


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

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

Robert Dober

On 7/13/07 said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,575
Members
45,054
Latest member
LucyCarper

Latest Threads

Top