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
按照惯例,多行显示不应打印任何尾随新行。
假设您在 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
按照惯例,多行显示不应打印任何尾随新行。