[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Dealing properly with scope; came from:combine array(string) to string?

Todd Benson

3/20/2008 10:57:00 PM

In much of my code, I've built an Array object before a block for
scope reasons. Is this common practice?

b = %w|a b c d e|
a = [] #instantiation
b.each {|i| a << i*2}
puts a

Todd

3 Answers

Daniel Finnie

3/20/2008 11:15:00 PM

0

You can usually use inject or collect to eliminate the a = [] line.
For example:

b = %w[a b c d e]
a = b.collect {|i| i * 2 }

Also, I would caution against using the variable i as anything but a
loop counter.

Regards,
Dan

On Thu, Mar 20, 2008 at 6:56 PM, Todd Benson <caduceass@gmail.com> wrote:
> In much of my code, I've built an Array object before a block for
> scope reasons. Is this common practice?
>
> b = %w|a b c d e|
> a = [] #instantiation
> b.each {|i| a << i*2}
> puts a
>
> Todd
>
>

Todd Benson

3/21/2008 7:15:00 AM

0

On Thu, Mar 20, 2008 at 6:14 PM, Daniel Finnie <dan@danfinnie.com> wrote:
> You can usually use inject or collect to eliminate the a = [] line.
> For example:
>
>
> b = %w[a b c d e]
> a = b.collect {|i| i * 2 }

Unless you have a method that doesn't return an array (i.e. something
other than map/collect). Sometimes you have to build the array inside
the iterator. I was just wondering if this was common practice.

>
> Also, I would caution against using the variable i as anything but a
> loop counter.

For production code, I agree. But, I think even then, I wouldn't use "i".

Todd

Robert Klemme

3/21/2008 8:52:00 AM

0

On 21.03.2008 08:14, Todd Benson wrote:
> On Thu, Mar 20, 2008 at 6:14 PM, Daniel Finnie <dan@danfinnie.com> wrote:
>> You can usually use inject or collect to eliminate the a = [] line.
>> For example:
>>
>> b = %w[a b c d e]
>> a = b.collect {|i| i * 2 }
>
> Unless you have a method that doesn't return an array (i.e. something
> other than map/collect). Sometimes you have to build the array inside
> the iterator. I was just wondering if this was common practice.

Yes, that's perfectly ok. Often you can also use a variant using
#inject, like

irb(main):003:0> b = %w[a b c d e]
=> ["a", "b", "c", "d", "e"]
irb(main):004:0> b.inject([]){|ar,el| ar << el*2}
=> ["aa", "bb", "cc", "dd", "ee"]

But that would be silly in this case since there is #map / #collect.

Kind regards

robert