假设您在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
,就会显示自定义显示?
答案 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