[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Array.join for nested arrays

freeunli

6/28/2007 6:39:00 PM

Doing

arr = [1, [2, [3, 4], 5], 6]
arr.join(',')

in Ruby 1.8.6 produces the following string:

1,2,3,4,5,6

Looking at the docs (e.g. http://www.noobkit.com/ruby-...),
Array.join should work as following:

"Returns a string created by converting each element of the array to a
string, separated by sep."

Doing the following:

arr.each do |e|
puts e.to_s
end

produces:

1
2345
6

Thus, arr.join(',') should be:

1, 2345, 6

Am I missing something? How can I do the above?

8 Answers

Martin DeMello

6/28/2007 7:18:00 PM

0

On 6/29/07, freeunli@yahoo.com <freeunli@yahoo.com> wrote:
>
> Thus, arr.join(',') should be:
>
> 1, 2345, 6
>
> Am I missing something? How can I do the above?

Here's the most straightforward way:

arr = [1, [2, [3, 4], 5], 6]
a = ""
arr.each {|i| a << i.to_s << ","}
a.chop!

martin

freeunli

6/28/2007 7:49:00 PM

0

Martin, thanks! Should the behavior of "join" be like this or the docs
are wrong?

Robert Dober

6/28/2007 8:30:00 PM

0

On 6/28/07, fu <freeunli@yahoo.com> wrote:
> Martin, thanks! Should the behavior of "join" be like this or the docs
> are wrong?
>
>
>
Very surprised about this behavior, IMHO it is wrong, at least it is
inconsistent :

irb(main):007:0> a=[1,[2,[3,4],5],6]
=> [1, [2, [3, 4], 5], 6]
irb(main):008:0> a.join(",")
=> "1,2,3,4,5,6"
irb(main):009:0> b=[1,{2=>42},{3=>[4,5]}]
=> [1, {2=>42}, {3=>[4, 5]}]
irb(main):010:0> b.join(",")
=> "1,242,345"

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

Rob Biedenharn

6/28/2007 10:25:00 PM

0

On Jun 28, 2007, at 4:29 PM, Robert Dober wrote:
> On 6/28/07, fu <freeunli@yahoo.com> wrote:
>> Martin, thanks! Should the behavior of "join" be like this or the
>> docs
>> are wrong?
>>
> Very surprised about this behavior, IMHO it is wrong, at least it is
> inconsistent :
>
> irb(main):007:0> a=[1,[2,[3,4],5],6]
> => [1, [2, [3, 4], 5], 6]
> irb(main):008:0> a.join(",")
> => "1,2,3,4,5,6"
> irb(main):009:0> b=[1,{2=>42},{3=>[4,5]}]
> => [1, {2=>42}, {3=>[4, 5]}]
> irb(main):010:0> b.join(",")
> => "1,242,345"
>
> Robert
> --
> I always knew that one day Smalltalk would replace Java.
> I just didn't know it would be called Ruby
> -- Kent Back

Have you look at how Array#to_s is described as returning Array#join
(the only difference being that to_s doesn't accept an argument and
the default value of the separator is $,)?

irb(main):001:0> a = [1,[2,[3,4],5],6]
=> [1, [2, [3, 4], 5], 6]
irb(main):002:0> a.to_s
=> "123456"
irb(main):003:0> a.join(',')
=> "1,2,3,4,5,6"
irb(main):004:0> $, = '-'
=> "-"
irb(main):005:0> a.to_s
=> "1-2-3-4-5-6"
irb(main):006:0> a.join
=> "1-2-3-4-5-6"
irb(main):007:0> a.join(',')
=> "1,2,3,4,5,6"

Hmm, what about that one with the hash for an element? (Remember, $,
is still redefined to '-')

irb(main):008:0> b=[1,{2=>42},{3=>[4,5]}]
=> [1, {2=>42}, {3=>[4, 5]}]
irb(main):009:0> b.to_s
=> "1-2-42-3-4-5"
irb(main):010:0> b.join(',')
=> "1,2-42,3-4-5"

Hash#to_s first converts to an array of [key,value] pairs and then
converts that to a string using Array#join with the default separator.

It seems that the use of "default" here, means the $, from Array#join
(separator=$,), not the argument given to b.join

OK, one more:

irb(main):011:0> b.last[4]=6
=> 6
irb(main):012:0> b
=> [1, {2=>42}, {3=>[4, 5], 4=>6}]
irb(main):013:0> b.join(',')
=> "1,2-42,3-4-5-4-6"

Possibly unexpected, but I don't see it as inconsistent.

-Rob

Rob Biedenharn http://agileconsult...
Rob@AgileConsultingLLC.com



Giles Bowkett

6/28/2007 10:48:00 PM

0

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

It's Kent Beck, isn't it?

Cool quote btw.

--
Giles Bowkett

Blog: http://gilesbowkett.bl...
Portfolio: http://www.gilesg...

Robert Dober

6/29/2007 4:46:00 AM

0

> > I always knew that one day Smalltalk would replace Java.
> > I just didn't know it would be called Ruby
> > -- Kent Back
>
> It's Kent Beck, isn't it?
>
> Cool quote btw.
>
> --
> Giles Bowkett
>
> Blog: http://gilesbowkett.bl...
> Portfolio: http://www.gilesg...
>
>

It's Kent, AFAIR Rick got confirmation from Kent himself.
I recently attributed it to Alain Kay, Rick shook a friendly
forefinger at me and I felt so bad to decide to change my sig. I have
seen it before on this list though ;)

BTW Giles I do not remember any mention of the $, change in the doc,
but agreed that would make it consistent, it is therefore a good way
to look at that behavior without too much surprise.

Cheers
R.
-

Giles Bowkett

6/29/2007 5:53:00 PM

0

> > > I always knew that one day Smalltalk would replace Java.
> > > I just didn't know it would be called Ruby
> > > -- Kent Back
> >
> > It's Kent Beck, isn't it?
> >
> > Cool quote btw.

> It's Kent, AFAIR Rick got confirmation from Kent himself.

Sorry, no, I mean Beck not Back.

> I recently attributed it to Alain Kay, Rick shook a friendly
> forefinger at me and I felt so bad to decide to change my sig. I have
> seen it before on this list though ;)

Definitely an awesome quote.

> BTW Giles I do not remember any mention of the $, change in the doc,
> but agreed that would make it consistent, it is therefore a good way
> to look at that behavior without too much surprise.

Hmm. I don't remember saying what you're agreeing with me about, but
hey, obviously I must have been right.

--
Giles Bowkett

Blog: http://gilesbowkett.bl...
Portfolio: http://www.gilesg...

Robert Dober

6/29/2007 7:10:00 PM

0

On 6/29/07, Giles Bowkett <gilesb@gmail.com> wrote:
> > > > I always knew that one day Smalltalk would replace Java.
> > > > I just didn't know it would be called Ruby
> > > > -- Kent Back
> > >
> > > It's Kent Beck, isn't it?
> > >
> > > Cool quote btw.
>
> > It's Kent, AFAIR Rick got confirmation from Kent himself.
>
> Sorry, no, I mean Beck not Back.

I hereby declare myself an Agghead!!!!

Thx Giles, quote corrected, I can only hope that Kent is *not* reading
this list!!!

> Hmm. I don't remember saying what you're agreeing with me about, but
> hey, obviously I must have been right.
Quite obviously ;)

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