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

Adh*_*ham 7 read-eval-print-loop 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)
Run Code Online (Sandbox Code Playgroud)

现在,如果您处于REPL模式,只需mt输入mt并按Enter 即可查看值:

mt
MyType(5,[1.2,4.1,2.0],0.2)
Run Code Online (Sandbox Code Playgroud)

如果我想自定义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
Run Code Online (Sandbox Code Playgroud)

但是使用另一个显示值的函数mt似乎是多余的.我需要扩展哪个功能,只需输入mt,就会显示自定义显示?

Fen*_*ang 7

注意:从Julia 0.5及更高版本开始,spencerlyon2的答案不再正确.

鉴于你的类型

type MyType
    ?::Int64
    ?::Vector{Float64}
    ?::Float64
end
Run Code Online (Sandbox Code Playgroud)

如果要自定义单行显示,请添加如下方法Base.show:

function Base.show(io::IO, me::MyType)
    print(io, "MyType: ?:", me.?, " ?:", me.?, " ?:", me.?)
end
Run Code Online (Sandbox Code Playgroud)

使用单行显示的示例:

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
Run Code Online (Sandbox Code Playgroud)

按照惯例,这种方法应该包含任何新行.这样可以在嵌入其他对象(如数组或矩阵)时很好地显示.通常,最好将可以解析和评估的内容输出到与所显示的对象相等的对象中,但这不是一个严格的规则.

如果要自定义多行显示,请添加如下方法Base.show:

function Base.show(io::IO, ::MIME"text/plain", me::MyType)
    println(io, "MyType")
    print(io, "?:", me.?, " ?:", me.?, " ?:", me.?)
end
Run Code Online (Sandbox Code Playgroud)

请注意,如果不包含此方法,则将使用单行显示.当您的对象单独显示时,在REPL中使用多行显示:

julia> MyType(5, [1.2, 4.1, 2], 0.2)
MyType
?:5 ?:[1.2, 4.1, 2.0] ?:0.2
Run Code Online (Sandbox Code Playgroud)

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


spe*_*on2 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
Run Code Online (Sandbox Code Playgroud)

  • 这个答案在0.5及以后已经过时了.请参阅[此答案](http://stackoverflow.com/a/43624440/3575047)以获取最新的解决方案. (2认同)