在朱

2015-07-21 30 views
7

複合類型的定製的顯示器假設你定義朱莉婭一個新的複合類型和該類型的變量:在朱

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值打字mt並按Enter鍵:

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

您可以爲您的類型定製一個'writemime'方法,例如'Base.writemime(io :: IO,:: MIME「text/plain」,mt :: MyType)= println(mt.α)' – jverzani

回答

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 
+0

謝了哥們。這正是我所期待的。 – Adham

+0

這引出了一個問題:那麼有什麼區別? – mschauer

+0

我認爲這是正確的,但請更正:在REPL中,'display'調用'writemime',默認爲'showlimited',然後調用'show'。所以兩者都可以工作,但是如果兩者都定義了'writemime',那麼就調用它。 – jverzani

6

注意:由spencerlyon2答案不再是正確的,因爲朱莉婭0.5及更高版本。

鑑於你的類型

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 

按照慣例,多行顯示不應該打印任何尾隨的新行。