Подавить печать для нестандартных конструкций в Юлии - PullRequest
0 голосов
/ 04 марта 2020

У меня есть структура, в которой много циклических ссылок. Это похоже на это:

mutable struct Friend
a                    :: Int64
b                    :: Float64
your_best_friend     :: Union{Nothing, Friend}
you_are_best_friend  :: Union{Nothing, Friend}
Friend() = new()
end

Любые два человека, которые являются лучшими друзьями друг с другом, вызовут круговую ссылку, когда это будет напечатано. Джулия обрабатывает эти циклические ссылки, так что печать не go вечна, но я бы предпочел вообще не печатать всякий раз, когда создается переменная структуры Friend. Я знаю, что supressor.jl - вещь, но мне интересно, есть ли решение, присущее Base Julia. По сути, есть ли опция для структур, чтобы объект не печатался при назначении без использования дополнительного пакета? Если нет, какова следующая лучшая вещь? Я не специалист по CS, поэтому я не уверен, какое время вычислений занимает печать, но я хотел бы избежать этого, если это возможно (и я не уверен, что supressor.jl удаляет время печати или если печать все еще занимает дополнительное время, но просто не отображается). Это кажется простым для меня, но я не могу найти решение в документации. Извините, если это очевидно и спасибо заранее!

-J

1 Ответ

0 голосов
/ 04 марта 2020

Вам нужно перегрузить Base.show, чтобы изменить способ отображения объектов в REPL:

julia> mutable struct Friend
   a                    :: Int64
   b                    :: Float64
   your_best_friend     :: Union{Nothing, Friend}
   you_are_best_friend  :: Union{Nothing, Friend}
   Friend() = new()
   end

julia> Friend()
Friend(0, 0.0, #undef, #undef)

julia> import Base.show

julia> show(io::IO, f::Friend) = show(io, "Friend $(f.a)")
show (generic function with 223 methods)

julia> d = Friend()
"Friend 0"

Обратите внимание, что если вы также хотите изменить способ печати за пределами командной строки REPL, вам также может понадобиться перегрузка печати через import Base.print

...