What's the justification for it NOT doing that? (Just because the docs
say so?)
I suspect that it's more like the join method #flatten s the array
before joining, instead of recursing. But my C isn't good enough to
tell what rb_ary_join is really doing inside.
I'm not sure I can think of a real use case for either scenario. The
only one I can make up is where you want to override Array#to_s, where
you'd want the last line below...
irb(main):001:0> class Foo; def to_s;"SSS";end; def inspect;"III";end;
end
=> nil
irb(main):002:0> a = [ 1, 2, Foo.new, [ 3, Foo.new, [ 4, 5 ] ] ]
=> [1, 2, III, [3, III, [4, 5]]]
irb(main):003:0> a.join( ',' )
=> "1,2,SSS,3,SSS,4,5"
irb(main):005:0> class Array; def to_s; "<hidden>"; end; end
=> nil
irb(main):006:0> a.to_s
=> "<hidden>"
irb(main):008:0> a.join( ',' )
=> "1,2,SSS,3,SSS,4,5"
...to return "1,2,SSS,<hidden>" instead.
Hrm...yeah, I think I'd prefer that simpler and more powerful
implementation. Of course, if you really wanted it, you could change
it yourself:
irb(main):009:0> class Array
irb(main):010:1> def join( sep='' )
irb(main):011:2> output = ""
irb(main):012:2> each_with_index do |v,i|
irb(main):013:3* output << v.to_s
irb(main):014:3> output << sep unless i == (self.length-1)
irb(main):015:3> end
irb(main):016:2> output
irb(main):017:2> end
irb(main):018:1> end
=> nil
irb(main):019:0> a.join( ',' )
=> "1,2,SSS,<hidden>"
...but (barring someone else's good explanation) I'd rather see the
implementation changed to match the documentation (and force you to
use a.flatten.join(',') if that's what you want) than the reverse.
···
On Feb 14, 12:52 am, "Farrel Lifson" <farrel.lif...@gmail.com> wrote:
What is the justification for [1,2,[3,4]].join(',') being '1,2,3,4'
instead of '1,2,34'? According to ruby-doc.org join "Returns a string
created by converting each element of the array to a string, separated
by sep.". Why should an element be recursively joined if it's also an
array?