我有
type MyArray{T,N} <: AbstractArray{T,N}
x::Array{T,N}
y::Int
end
它打印得像一个数组。但是,我希望它的show / print / display / Juno渲染表现得像它的任何一个角色。类型。是否有一种很好的方法可以在不删除AbstractArray
子类型的情况下删除覆盖?
答案 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