Julia中复合类型的自定义显示
假设您在Julia中定义了一个新的复合类型和该类型的变量:Julia中复合类型的自定义显示,julia,read-eval-print-loop,Julia,Read Eval Print Loop,假设您在Julia中定义了一个新的复合类型和该类型的变量: type MyType α::Int64 β::Vector{Float64} γ::Float64 MyType(α::Int64, β::Vector{Float64}, γ::Float64) = new(α, β, γ) end mt = MyType(5, [1.2, 4.1, 2], 0.2) 现在,如果您处于REPL模式,只需输入mt并按Enter键,即可检查mt的值: mt MyType(5,[1.2
type MyType
α::Int64
β::Vector{Float64}
γ::Float64
MyType(α::Int64, β::Vector{Float64}, γ::Float64) = new(α, β, γ)
end
mt = MyType(5, [1.2, 4.1, 2], 0.2)
现在,如果您处于REPL模式,只需输入mt
并按Enter键,即可检查mt
的值:
mt
MyType(5,[1.2,4.1,2.0],0.2)
如果我想自定义MyType
变量的显示方式,我可以定义一个函数并像customized\u display(mt)
那样使用它:
但是使用另一个函数来显示mt
的值似乎是多余的。我需要扩展哪个功能,以便只需键入mt
,即可显示自定义显示?您应该定义以下功能之一(它们都可以工作,并且具有相同的效果):
注意:从Julia 0.5及更高版本开始,Spenceryon2的答案不再正确 根据你的类型
type MyType
α::Int64
β::Vector{Float64}
γ::Float64
end
如果要自定义单行显示,请将方法添加到Base.show
,如下所示:
function Base.show(io::IO, me::MyType)
print(io, "MyType: α:", me.α, " β:", me.β, " γ:", me.γ)
end
function Base.show(io::IO, ::MIME"text/plain", me::MyType)
println(io, "MyType")
print(io, "α:", me.α, " β:", me.β, " γ:", me.γ)
end
正在使用的单线显示示例:
julia> [MyType(5, [1.2, 4.1, 2], 0.2)]
1-element Array{MyType,1}:
MyType: α:5 β:[1.2, 4.1, 2.0] γ:0.2
按照惯例,此方法不应包含任何换行符。这样,当嵌入到其他对象(如数组或矩阵)中时,它可以很好地显示。通常,最好将可以解析和计算的内容输出到与所显示的对象相同的对象中,但这不是一个硬性规则
如果要自定义多行显示,请将方法添加到Base.show
,如下所示:
function Base.show(io::IO, me::MyType)
print(io, "MyType: α:", me.α, " β:", me.β, " γ:", me.γ)
end
function Base.show(io::IO, ::MIME"text/plain", me::MyType)
println(io, "MyType")
print(io, "α:", me.α, " β:", me.β, " γ:", me.γ)
end
请注意,如果不包括此方法,则将使用单线显示。当对象单独显示时,在REPL处使用多行显示:
julia> MyType(5, [1.2, 4.1, 2], 0.2)
MyType
α:5 β:[1.2, 4.1, 2.0] γ:0.2
按照惯例,多行显示不应打印任何尾随的新行。您可以为您的类型自定义
writemime
方法,例如,Base.writemime(io::io,::MIME“text/plain”,mt::MyType)=println(mt.α)
。这正是我所要寻找的。这就引出了一个问题:那有什么区别呢?我认为这是正确的,但请更正:在REPL中,display
调用writemime
,默认为showlimited
,然后调用show
。所以两者都可以工作,但是如果两者都被定义,那么就会调用writemime
one。谢谢@jverzani。重要的是在这里有这些信息。这个答案在0.5及更高版本中已经过时。请参阅以获取最新的解决方案。