File.join : can't convert Fixnum into String?

Where's the Fixnum?

  class X < Array
    def to_s
      join('.')
    end
    def inspect ; to_s ; end
  end
  x=X.new
  x << 1
  x << 2
  x << 3
  x #=> 1.2.3
  x.class #=> X
  File.join( x, 'index.rb' )

  TypeError: can't convert Fixnum into String
        from (irb):19:in `join'
        from (irb):19

···

from :0

Works for me

irb(main):001:0> class X < Array
irb(main):002:1> def to_s
irb(main):003:2> join('.')
irb(main):004:2> end
irb(main):005:1> def inspect ; to_s ; end
irb(main):006:1> end
=> nil
irb(main):007:0> x=X.new
=>
irb(main):008:0> x << 1
=> 1
irb(main):009:0> x << 2
=> 1.2
irb(main):010:0> x << 3
=> 1.2.3
irb(main):011:0> x.class
=> X
irb(main):012:0> File.join(x,'index.rb')
=> "1/2/3/index.rb"

I'm running 1.8.2 on Windows 2000.

Farrel

···

On 08/08/06, Trans <transfire@gmail.com> wrote:

Where's the Fixnum?

  class X < Array
    def to_s
      join('.')
    end
    def inspect ; to_s ; end
  end
  x=X.new
  x << 1
  x << 2
  x << 3
  x #=> 1.2.3
  x.class #=> X
  File.join( x, 'index.rb' )

  TypeError: can't convert Fixnum into String
        from (irb):19:in `join'
        from (irb):19
        from :0

Where's the Fixnum?

  class X < Array
    def to_s
      join('.')
    end
    def inspect ; to_s ; end
  end
  x=X.new
  x << 1
  x << 2
  x << 3
  x #=> 1.2.3
  x.class #=> X
  File.join( x, 'index.rb' )

  TypeError: can't convert Fixnum into String
        from (irb):19:in `join'
        from (irb):19
        from :0

File.join doesn't use Array#to_s. See:

irb(main):001:0> File.join %w(a b), "c"
=> "a/b/c"
irb(main):002:0> File.join ["a", "b"]
=> "a/b"
irb(main):003:0>
irb(main):004:0> File.join [1, 2]
TypeError: can't convert Fixnum into String
        from (irb):4:in `join'
        from (irb):4
irb(main):005:0>

···

On 8/8/06, Trans <transfire@gmail.com> wrote:
        from :0

--
- Simen

Seems like
1. File.join is recursive on arrays. i.e. your example is [almost] equivalent to
File.join([1,2,3], 'index.rb') and that is equivalent to
File.join(File.join(1,2,3), 'index.rb')

2. File.join doesn't do any type conversions. I.e. it won't call your to_s.

···

On 8/8/06, Simen Edvardsen <toalett@gmail.com> wrote:

On 8/8/06, Trans <transfire@gmail.com> wrote:
> Where's the Fixnum?
File.join doesn't use Array#to_s. See:

Jan Svitok wrote:

> > Where's the Fixnum?
> File.join doesn't use Array#to_s. See:

Seems like
1. File.join is recursive on arrays. i.e. your example is [almost] equivalent to
File.join([1,2,3], 'index.rb') and that is equivalent to
File.join(File.join(1,2,3), 'index.rb')

2. File.join doesn't do any type conversions. I.e. it won't call your to_s.

It does type conversion, which is why it says it can't convert Fixnum
to String. But you are right that it does not call #to_s, rather it
calls #to_str. But it doesn't call to_str for an Array, as you point
out. Seem kind of anti-duck. But anyhow guess I'll have to delegate
instead of subclass.

Thanks,
T.

···

On 8/8/06, Simen Edvardsen <toalett@gmail.com> wrote:
> On 8/8/06, Trans <transfire@gmail.com> wrote: