2015-03-01 4 views
1

Я совершенно новый для Джулии, и я изучаю перенос кода Python на Джулию. Этот код использует перегрузку __repr __() для отображения типов вырезок. Я понимаю, что Julia предоставляет метод () для этой функции. Но я не могу понять.julia интерполяция собственного типа со строкой()

julia> type Thomas 
     t::Integer 
     end 
julia> function Base.string(t::Thomas) 
     "---> $(t.t) <---" 
     end 
julia> r = Thomas(8); 

С этими определениями я ожидал мой строку (:: Томас) функцию, которая вызывается всякий раз, когда значение типа Томас необходимо преобразовать в строку. В одном случае, он работает, как ожидалось:

julia> println("$r") 
---> 8 <--- 

Но для большинства случаев это не так:

julia> println(r) 
Thomas(8) 

julia> println(" $r") 
Thomas(8) 

julia> println("r = $r") 
r = Thomas(8) 

julia> repr(r) 
"Thomas(8)" 

Что я не так? Есть ли какая-то другая функция, которую я должен определить для моего нового настраиваемого типа?

Я бегу Julia 0.4.0-dev. (код выше был вставлен из REPL версии 0.4.0-dev + 3607 (2015-02-26 07:41 UTC), Commit bef6bf3 *, x86_64-linux-gnu)

ответ

0

Возможно, вы захотите переопределить show способ также.

Base.show(io::IO, x::Thomas) = show(io, string(x)) 
+0

Спасибо Винсент. Кажется, есть несколько функций: 'show()', 'print()', 'display()' и т. Д. Каково отношение? И где они должны использоваться. Должны ли некоторые из них производить анализируемый результат? Я не нашел никакой полезной информации по этой теме в документации по документации Юлии (в противном случае очень хорошо). Любые указатели оценили! – filijokus

1

Вы должны переопределить две версии Base.print на самом деле, чтобы получить последовательное поведение интерполяции строк:

Base.print(io::IOBuffer, t::Thomas) = Base.print(io, "---> $(t.t) <---") 
Base.print(t::Thomas) = Base.print("---> $(t.t) <---") 

Тогда вы будете иметь:

print(t) 
string(t) 
string(t, t, ...) 
"$t" 
"t = $t" 
"$t $t $t" 

и сотрудничество.

+0

'print' будет делегировать' show', поэтому лучше переопределить 'Base.show', как в решении Дэвида Сандерса. –

2

В настоящее время достаточно всего Base.show должно быть достаточно, следующим образом.

type Thomas 
    t::Int # note Int not Integer 
end 

Base.show(io::IO, x::Thomas) = print(io, "Thomas with $(x.t)") 

Обратите внимание, что в определении типа, вы должны использовать конкретный тип Int (эквивалент Int64 или Int32, в зависимости от размера слова вашего компьютера), а не абстрактный тип Integer, что приведет к плохой производительности ,

Ситуация с Base.show, Base.print и т.д., действительно сбивает с толку в данный момент, но с некоторой недавней работе (смотреть IOContext) должны получить упрощены и уточнены в ближайшее время.

Смежные вопросы