【问题标题】:Customized display of composite types in JuliaJulia 中复合类型的自定义显示
【发布时间】:2015-07-21 10:14:58
【问题描述】:

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

【问题讨论】:

  • 您可以为您的类型自定义writemime 方法,例如Base.writemime(io::IO, ::MIME"text/plain", mt::MyType) = println(mt.α)

标签: julia read-eval-print-loop


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您应该定义以下一个(它们都将起作用并具有相同的效果):

    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
    

    【讨论】:

    • 谢谢伙计。这正是我想要的。
    • 这就引出了一个问题:那么有什么区别呢?
    • 我认为这是正确的,但请更正:在 REPL 中,display 调用 writemime,默认为 showlimited,而后者又调用 show。所以两者都可以工作,但如果两者都定义了writemime,则会调用一个。
    • 谢谢@jverzani。在此处提供该信息很重要
    • 此答案在 0.5 及更高版本中已过时。请参阅this answer 了解最新的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    相关资源
    最近更新 更多