Great! that *seems* to work in my extremely limited testing so far, thanks
Milan!
Please note that I have since identified the error in my constructor
(entirely unrelated to any issues)... it should read:
NewIOType() = new(IOBuffer())
On Wednesday, 6 April 2016 11:06:17 UTC-3, Milan Bouchet-Valat wrote:
>
> Le mercredi 06 avril 2016 à 06:48 -0700, Daniel Arndt a écrit :
> > 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.
> I think you only need to provide write(s::NewIOType, x::UInt8). All
> higher-level write() methods will automatically use it.
>
>
> Regards
>