That error happens because your subtyping isn't entirely correct:
IsModifiedArray{Float64, 1} <: AbstractArray{Float64, 1} == false
with your definition. If you do
abstract SpecialArray{T,S} <: AbstractArray{T,S}
type IsModifiedArray{T,S} <: SpecialArray{T,S}
values :: Array{T,S}
ismodified :: Bool
end
you won't get that error.
If you want to pretty print results in Juno that won't be enough: Have a
look here <http://discuss.junolab.org/t/base-show-not-called-in-juno/931/8>.
Am Donnerstag, 29. September 2016 14:44:52 UTC+2 schrieb Chris Stook:
>
>
> I have defined a simple subtype of AbstractArray which keeps track if an
> array has been modified by the user. Base.show, Base.showcompact, and
> Base.display are overloaded. This works in the REPL, but with Atom I
> receive the following error.
>
> Julia Client - Internal Error
>
> MethodError: no method matching
> print_matrix(::IOContext{Base.AbstractIOBuffer{Array{UInt8,1}}},
> ::LTspice.IsModifiedArray{Float64,1}, ::String, ::String, ::String)
> Closest candidates are:
> print_matrix(::IO,
> !Matched::Union{AbstractArray{T,1},AbstractArray{T,2}}, ::AbstractString,
> ::AbstractString, ::AbstractString) at show.jl:1379
> print_matrix(::IO,
> !Matched::Union{AbstractArray{T,1},AbstractArray{T,2}}, ::AbstractString,
> ::AbstractString, ::AbstractString, !Matched::AbstractString) at
> show.jl:1379
> print_matrix(::IO,
> !Matched::Union{AbstractArray{T,1},AbstractArray{T,2}}, ::AbstractString,
> ::AbstractString, ::AbstractString, !Matched::AbstractString,
> !Matched::AbstractString) at show.jl:1379
> ...
> in #showarray#330(::Bool, ::Function,
> ::IOContext{Base.AbstractIOBuffer{Array{UInt8,1}}},
> ::LTspice.IsModifiedArray{Float64,1}, ::Bool) at .\show.jl:1618
> in verbose_show(::Base.AbstractIOBuffer{Array{UInt8,1}},
> ::MIME{Symbol("text/plain")}, ::LTspice.IsModifiedArray{Float64,1}) at
> .\multimedia.jl:50
> in #sprint#304(::Void, ::Function, ::Int64, ::Function,
> ::MIME{Symbol("text/plain")}, ::Vararg{Any,N}) at .\strings\io.jl:37
> in Type at C:\Users\Chris\.julia\v0.5\Juno\src\types.jl:48 [inlined]
> in Type at C:\Users\Chris\.julia\v0.5\Juno\src\types.jl:49 [inlined]
> in render(::Juno.Editor, ::LTspice.IsModifiedArray{Float64,1}) at
> C:\Users\Chris\.julia\v0.5\Juno\src\types.jl:12
> in (::Atom.##81#84)(::Dict{String,Any}) at
> C:\Users\Chris\.julia\v0.5\Atom\src\eval.jl:64
> in handlemsg(::Dict{String,Any}, ::Dict{String,Any},
> ::Vararg{Dict{String,Any},N}) at
> C:\Users\Chris\.julia\v0.5\Atom\src\comm.jl:148
> in (::Atom.##7#10)() at .\event.jl:68
>
>
> What do I need to overload to fix this?
>
> Code below:
>
> abstract SpecialArray <: AbstractArray
>
> Base.size(a::SpecialArray) = size(a.values)
> Base.linearindexing{T<:SpecialArray}(::Type{T}) = Base.LinearFast()
> Base.getindex(a::SpecialArray, i::Int) = a.values[i]
> Base.ndims(a::SpecialArray) = ndims(a.values)
> Base.show(io::IO, a::SpecialArray) = show(io,a.values)
> Base.showcompact(io::IO, a::SpecialArray) = showcompact(io,a.values)
> Base.display(a::SpecialArray) = display(a.values)
> """
> Same as Array, but tracks is user has modified values.
> """
> type IsModifiedArray{T,S} <: SpecialArray
> values :: Array{T,S}
> ismodified :: Bool
> end
>
> function Base.setindex!(a::IsModifiedArray, v, i::Int)
> a.ismodified = true
> a.values[i] = v
> end
>
> a = IsModifiedArray{Float64,1}([1.0,2.0,3.0],false) # error here
>
>