Julia 中复合类型的自定义显示

Customized display of composite types in Julia

假设您在 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 即可显示自定义显示?

您应该定义其中一个(它们都有效并且效果相同):

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

注意:从 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

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