从Base扩展`@ show`

时间:2019-10-03 02:32:26

标签: macros julia show

如何将Base的@show宏扩展到我自己的类型?

示例:

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 个答案:

答案 0 :(得分:5)

@show做的事情很简单:先打印表达式,然后输出=,然后是表达式的值。如果您想要其他行为,则可能应该定义自己的宏。如果要控制在右侧打印值的方式,则应扩展Base.show。扩展Base.show时,非常重要非常重要,即第一个参数是I / O缓冲区(例如io::IO),并且您的方法将写入该I / O缓冲区。这就是您的示例所缺少的。这有效:

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 :)

请注意,当在Julia REPL中打印值时,更新的Base.show方法现在也将导致“漂亮打印”:

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