由于子类型而覆盖显示重载

时间:2017-04-30 00:41:54

标签: arrays julia

我有

type MyArray{T,N} <: AbstractArray{T,N}
  x::Array{T,N}
  y::Int
end

它打印得像一个数组。但是,我希望它的show / print / display / Juno渲染表现得像它的任何一个角色。类型。是否有一种很好的方法可以在不删除AbstractArray子类型的情况下删除覆盖?

2 个答案:

答案 0 :(得分:2)

以下是使用Base.show恢复某个类型的标准invoke行为的方法:

julia> type MyArray{T,N} <: AbstractArray{T,N}
         x::Array{T,N}
         y::Int
       end

julia> Base.show(io::IO, A::MyArray) =
           invoke(show, Tuple{typeof(io), Any}, io, A)

julia> Base.show(io::IO, ::MIME"text/plain", A::MyArray) = show(io, A)

julia> MyArray([1, 2, 3], 4)
MyArray{Int64,1}([1, 2, 3], 4)

我不知道这是否能处理Juno部分;显然Juno使用自己的基础设施。

答案 1 :(得分:0)

不确定如何一般地恢复&#39;默认的show函数,但这很容易模拟:

julia> type MyArray{T,N} <: AbstractArray{T,N}
         x::Array{T,N}
         y::Int
       end

julia> Base.show(io::IO, a::MyArray) = print(io, "$(typeof(a))($(a.x), $(a.y))");
julia> Base.show(io::IO, ::MIME"text/plain", a::MyArray) = show(io, a);

julia> a = MyArray([1., 2., 3., 4., 5.], 5)
MyArray{Float64,1}([1.0, 2.0, 3.0, 4.0, 5.0], 5)

顺便说一下,我个人认为dump可以更好地工作,作为一个多线显示器&#39;对于这种包含数组的类型,函数比默认函数小:

julia> Base.show(io::IO, ::MIME"text/plain", a::MyArray) = dump(a);

julia> a
MyArray{Float64,1}
  x: Array{Float64}((5,)) [1.0, 2.0, 3.0, 4.0, 5.0]
  y: Int64 5