Расширение `@ show` из базы - PullRequest
       9

Расширение `@ show` из базы

3 голосов
/ 03 октября 2019

Как мне расширить макрос @show Base для моих собственных типов?

Пример:

struct friendly
    string
end

Base.show(f::friendly) = f.string * " :)"

p = friendly("people")

И затем вызов show(p) возвращает:

"people :)"

Но @show p делает обычные вещи (результат записной книжки):

p = friendly("people")

friendly("people")

Я попытался расширить макрос из базы:

Base.@show(f::friendly) = f.string * " :)"

Но это ошибкис:

syntax: invalid assignment location "begin
    Base.println("f::friendly = ", Base.repr(begin
    # show.jl, line 576
    #105#value = f::friendly
end))
    #105#value
end"

Stacktrace:
 [1] top-level scope at C:\Users\User\.julia\packages\IJulia\cwvsj\src\kernel.jl:52

1 Ответ

5 голосов
/ 03 октября 2019

@show делает что-то очень простое: печатает выражение, затем =, затем значение выражения. Если вам нужно другое поведение, вы, вероятно, должны определить свой собственный макрос. Если вы хотите контролировать, как значение печатается справа, вы должны расширить Base.show. При расширении Base.show очень важно , что первым аргументом является буфер ввода-вывода (например, io::IO), и что ваш метод выполняет запись в этот буфер ввода-вывода. Вот чего не хватает в вашем примере. Это работает:

julia> struct Friendly
           x::String
       end

julia> Base.show(io::IO, f::Friendly) = print(io, f.x, " :)")

julia> f = Friendly("Hi")
Hi :)

julia> @show f;
f = Hi :)

Обратите внимание, что обновленный метод Base.show теперь также приводит к "красивой печати", когда значение печатается в Julia REPL:

julia> f = Friendly("Hi")
Hi :)
...