2015-07-21 1 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 

Обратите внимание, что если вы не включили этот метод, то будет использоваться дисплей однострочный. Дисплей многострочный используется в РЕПЛ, когда ваш объект отображается на его собственное:

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

По соглашению, дисплей многострочный не должен печатать любые замыкающие новые линии.