2015-07-21 6 views
7

Angenommen, Sie einen neuen Verbundtyp in Julia definieren und eine Variable dieses Typs:Customized Anzeige der zusammengesetzten Typen in Julia

type MyType 
    α::Int64 
    β::Vector{Float64} 
    γ::Float64 

    MyType(α::Int64, β::Vector{Float64}, γ::Float64) = new(α, β, γ) 
end 
mt = MyType(5, [1.2, 4.1, 2], 0.2) 

Nun, wenn Sie in ERSATZ-Modus sind, können Sie einfach den Wert von mt überprüfen, indem Sie Eingabe mt und die Eingabetaste drücken:

mt 
MyType(5,[1.2,4.1,2.0],0.2) 

Wenn ich die Art und Weise Variablen MyType angezeigt anpassen möchten, ich eine Funktion definieren und verwenden sie es wie 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 

Aber die Verwendung einer anderen Funktion zur Anzeige von Werten von mt scheint redundant. Welche Funktion muss ich so erweitern, dass durch einfaches Tippen auf mt das angepasste Display angezeigt wird?

+2

Sie können eine 'writemime' Methode für Ihren Typ anpassen, zB' Base.writemime (io :: IO, :: MIME "text/plain", mt :: MeinTyp) = println (mt.a) ' – jverzani

Antwort

5

sollten Sie definieren ein der folgenden (sie werden beide arbeiten und haben die gleiche Wirkung):

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

Danke Kumpel. Genau das habe ich gesucht. – Adham

+0

Das wirft die Frage auf: Was ist der Unterschied, dann? – mschauer

+0

Ich denke, das ist richtig, aber Korrekturen bitte: in der REPL, 'display' ruft' writemime', die standardmäßig auf 'showlimited', die wiederum' show' aufrufen. Also werden beide funktionieren, aber wenn beide definiert sind, wird die 'Schreibzeit' aufgerufen. – jverzani

6

Hinweis: Die Antwort von spencerlyon2 ist nicht mehr die richtige von Julia 0,5 und später .

Angesichts Ihrer Art

type MyType 
    α::Int64 
    β::Vector{Float64} 
    γ::Float64 
end 

Wenn Sie die einzeilige Display anpassen, ein Verfahren zu Base.show wie folgt hinzu:

function Base.show(io::IO, me::MyType) 
    print(io, "MyType: α:", me.α, " β:", me.β, " γ:", me.γ) 
end 

Ein Beispiel der Anzeige einzeiligen verwendet wird:

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 

Per Konvention sollte diese Methode nicht enthalten alle Zeilenumbrüche. Dies ist so, dass es gut angezeigt wird, wenn es in andere Objekte wie Arrays oder Matrizen eingebettet wird. In der Regel wird es bevorzugt, etwas auszugeben, das analysiert und ausgewertet werden kann, in ein Objekt, das dem angezeigten Objekt entspricht. Dies ist jedoch keine strenge Regel.

Wenn Sie die mehrzeilige Anzeige anpassen, ein Verfahren zu Base.show wie folgt hinzu:

function Base.show(io::IO, ::MIME"text/plain", me::MyType) 
    println(io, "MyType") 
    print(io, "α:", me.α, " β:", me.β, " γ:", me.γ) 
end 

Beachten Sie, wenn Sie diese Methode nicht enthalten, dann ist die einzeilige Display verwendet wird. Die mehrzeilige Anzeige wird an der REPL verwendet wird, wenn das Objekt auf eigenem angezeigt:

julia> MyType(5, [1.2, 4.1, 2], 0.2) 
MyType 
α:5 β:[1.2, 4.1, 2.0] γ:0.2 

Vereinbarungs die mehrzeiliges Display keine Hinter neue Linien nicht gedruckt werden soll.