Julia中复合类型的定制显示

8
假设你在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,4.1,2.0],0.2)

如果我想自定义显示MyType变量的方式,我可以定义一个函数并像这样使用它:customized_display(mt)

function customized_display(me::MyType)
  println("MyType")
  println("α:$(me.α), β:$(me.β), γ:$(me.γ)")
end

customized_display(mt)
MyType
α:5, β:[1.2,4.1,2.0], γ:0.2

然而,使用另一个函数来显示mt的值似乎是多余的。我需要扩展哪个函数,以便仅通过键入mt即可显示自定义显示?


2
你可以为你的类型自定义一个 writemime 方法,例如: Base.writemime(io::IO, ::MIME"text/plain", mt::MyType) = println(mt.α) - jverzani
2个回答

8

注意:自Julia 0.5及以后版本,spencerlyon2的答案已经不再正确。

考虑到您的类型

type MyType
    α::Int64
    β::Vector{Float64}
    γ::Float64
end

如果您想自定义单行显示,可以像这样向Base.show添加一个方法:
function Base.show(io::IO, me::MyType)
    print(io, "MyType: α:", 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, ::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

按照惯例,多行显示不应该打印任何尾随的新行。


5

您应该定义以下其中之一(它们都可以实现同样的效果):

function Base.show(io::IO, me::MyType)
    println(io, "MyType")
    println(io, "α:$(me.α), β:$(me.β), γ:$(me.γ)")
end

function Base.writemime(io::IO, ::MIME"text/plain", me::MyType)
    println(io, "MyType")
    println(io, "α:$(me.α), β:$(me.β), γ:$(me.γ)")
end

谢谢,老兄。这正是我想要的。 - Adham
那就引出了一个问题:那么,它们有什么区别呢? - mschauer
我认为这是正确的,但请纠正我:在REPL中,“display”调用“writemime”,默认为“showlimited”,然后调用“show”。因此,两者都可以工作,但如果两者都定义了,“writemime”将被调用。 - jverzani
感谢@jverzani。在这里提供这些信息非常重要。 - spencerlyon2
2
此答案已过时,适用于0.5及更高版本。请参阅此答案以获取最新解决方案。 - Fengyang Wang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接