从 Base 扩展 `@show`

Extending `@show` from Base

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

示例:

struct friendly
    string
end

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

p = friendly("people")

然后调用 show(p) returns:

"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

@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 方法现在也会导致 "pretty printing":

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