Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Ruby (http://www.velocityreviews.com/forums/f66-ruby.html)
-   -   Loop over an array that changes the elements (http://www.velocityreviews.com/forums/t842305-loop-over-an-array-that-changes-the-elements.html)

Bernd Burnt 07-13-2007 11:39 AM

Loop over an array that changes the elements
 
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-forum.com/.


Robert Dober 07-13-2007 11:52 AM

Re: Loop over an array that changes the elements
 
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-forum.com/.
>
>


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@fysh.org 07-13-2007 12:53 PM

Re: Loop over an array that changes the elements
 
> 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@fysh.org 07-13-2007 12:57 PM

Re: Loop over an array that changes the elements
 
> 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 07-13-2007 12:58 PM

Re: Loop over an array that changes the elements
 
El Jul 13, 2007, a las 2:53 PM, benjohn@fysh.org escribi=F3:

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


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

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

-- fxn



Robert Dober 07-13-2007 01:00 PM

Re: Loop over an array that changes the elements
 
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 07-13-2007 01:16 PM

Re: Loop over an array that changes the elements
 
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 07-13-2007 01:25 PM

Re: Loop over an array that changes the elements
 
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



All times are GMT. The time now is 03:17 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.