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

时间:2015-07-21 10:14:58

标签: 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,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 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分: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