Project

General

Profile

Actions

Bug #1893

closed

Recursive Enumerable#join is surprising

Added by bitsweat (Jeremy Daer) over 15 years ago. Updated over 13 years ago.

Status:
Closed
Target version:
-
ruby -v:
ruby 1.9.2dev (2009-08-06) [i386-darwin9.7.0]
Backport:
[ruby-core:24786]

Description

=begin

Bar = Struct.new(:a, :b)
=> Bar
bars = [Bar.new('1', '2'), Bar.new('3', '4')]
=> [#<struct Bar a="1", b="2">, #<struct Bar a="3", b="4">]
bars * '--'
=> "1--2--3--4"

Surprising? It looks like joining Arrays not Structs. Let's define to_s:

class Bar; def to_s; 'foo' end end
=> nil
bars * '--'
=> "1--2--3--4"

Doesn't work! Strange. But remove to_a and it works!

class Bar; undef_method :to_a end
=> Bar
bars * '--'
=> "foo--foo"

Also note that defining to_str works because ary_join_1 checks rb_check_string_type first, then rb_check_convert_type:

class Bar; def to_str; 'baz' end end
=> nil
bars * '--'
=> "baz--baz"

See r23951 for the change:

  • array.c (ary_join_1): recursive join for Enumerators (and objects with #to_a).

There are two solutions:

  • remove Struct#to_a, or
  • tighten the recursive join check for arrays

I think we need a to_ary (like to_str) for the recursive array case instead of using to_a.
=end


Related issues 1 (0 open1 closed)

Related to Ruby master - Feature #7226: Add Set#join method as a shortcut for to_a.joinRejectedknu (Akinori MUSHA)10/28/2012Actions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0