I didn't know about such capability, thanks. But I still can't figure out
how to call this constructor. E.g.:
julia> Bar{Int}()
ERROR: MethodError: `convert` has no method matching convert(::Type{Bar{
Int64}})
This may have arisen from a call to the constructor Bar{Int64}(...),
since type constructors fall back to convert methods.
Closest candidates are:
convert{T}(::Type{T}, !Matched::T)
Bar{#s6,T}()
call{T}(::Type{T}, !Matched::Any)
in call at essentials.jl:57
Don't know if it matters, but I also have a different output of
`methods(Bar{Int})` than you:
julia> methods(Bar{Int})
3-element Array{Any,1}:
call{#s6,T}(::Type{Bar{#s6}}) at
/home/<username>/work/playground/contructors.jl:11
call{T}(::Type{T}, arg) at essentials.jl:56
call{T}(::Type{T}, args...) at essentials.jl:57
On Monday, October 12, 2015 at 1:06:14 AM UTC+3, Yichao Yu wrote:
>
> On Sun, Oct 11, 2015 at 5:57 PM, Andrei Zh <[email protected]
> <javascript:>> wrote:
> > Let's consider 2 types with inner constructors:
> >
> > type Foo
> > x::Array{Int,1}
> >
> >
> > Foo() = Foo(zeros(Int, 10))
> > end
> >
> > type Bar{T}
> > x::Array{T,1}
> >
> >
> > Bar() = Bar(zeros(T, 10))
> > end
> >
> > The only difference between them is that `Bar` has type parameter while
> > `Foo` doesn't. I'd expect their inner constructors behave the same way,
> but
> > `Bar` turns to ignore inner constructor definition:
> >
> > julia> methods(Foo)
> > 3-element Array{Any,1}:
> > call(::Type{Foo}) at /home/<username>/work/playground/contructors.jl:5
> > call{T}(::Type{T}, arg) at essentials.jl:56
> > call{T}(::Type{T}, args...) at essentials.jl:57
> >
> >
> > julia> methods(Bar)
> > 2-element Array{Any,1}:
> > call{T}(::Type{T}, arg) at essentials.jl:56
> > call{T}(::Type{T}, args...) at essentials.jl:57
> >
> > Is it a bug or a feature and how to make `Bar` recognize inner
> constructor
> > (outer constructor is not an option here since it uses type parameter
> `T` in
> > constructor body, but not in its constructor)?
> >
>
> As you pointed out, the inner constructor can access the type
> parameter and therefore the type parameter needs to be specified in
> order to call it.
>
> julia> methods(Bar{Int})
> 3-element Array{Any,1}:
> call{T}(::Type{Bar{T}}) at none:3
> call{T}(::Type{T}, arg) at essentials.jl:55
> call{T}(::Type{T}, args...) at essentials.jl:56
>