This is shorter than it looks, it's mostly code / output. Feel free to skip 
to the tl;dr.

I'm playing around with an idea where I've created a new type that wraps an 
IOBuffer.

This new type would hold some other information as well, but for it's 
read/write operations, I wanted to just pass the calls on to the 
encapsulated IOBuffer. I thought this would be fairly simple (as any good 
programming story begins):

import Base: write


type NewIOType <: IO
    buffer::IOBuffer
    some_other_stuff::Int
    
    new() = new(IOBuffer())
end


write(io::NewIOType, x...) = write(io.buffer, x...)

However, write seems to conflict with multiple other definitions:

WARNING: New definition 
    write(Main.NewIOType, Any...) at In[1]:10
is ambiguous with: 
    write(Base.IO, Base.Complex) at complex.jl:78.
To fix, define 
    write(Main.NewIOType, Base.Complex)
before the new definition.
WARNING: New definition 
    write(Main.NewIOType, Any...) at In[1]:10
is ambiguous with: 
    write(Base.IO, Base.Rational) at rational.jl:66.
...
and on and on
...

I understand the problem: Although my first parameter is more specific, *my 
second is not*. In an exploratory move, I tried:

write{T}(io::NewIOType, x::T) = write(io.buffer, x)

Thinking that this would create a new write function for every type T and 
therefore be more specific (*I could use some clarity here, as obviously my 
understanding is incorrect*). I get this:

WARNING: New definition 
    write(Main.NewIOType, #T<:Any) at In[1]:10
is ambiguous with: 
    write(Base.IO, Base.Complex) at complex.jl:78.
To fix, define 
    write(Main.NewIOType, _<:Base.Complex)
before the new definition.
WARNING: New definition 
    write(Main.NewIOType, #T<:Any) at In[1]:10
is ambiguous with: 
    write(Base.IO, Base.Rational) at rational.jl:66.
To fix, define 
    write(Main.NewIOType, _<:Base.Rational)

*tl;dr Can I wrap an IO instance, and pass all calls to 'write' to the 
wrapped instance's version?*

I am entirely capable and aware of other approaches, so while I do 
appreciate suggestions of alternative approaches, I am specifically 
wondering if there is some mechanism that I'm missing that easily overcomes 
this.

Cheers,
Dan

Reply via email to