从Base扩展`@ show`

Ale*_*lec 3 macros show julia

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

例:

struct friendly
    string
end

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

p = friendly("people")
Run Code Online (Sandbox Code Playgroud)

然后调用show(p)返回:

"people :)"
Run Code Online (Sandbox Code Playgroud)

但是@show p正常的事情(笔记本结果)只是:

p = friendly("people")

friendly("people")
Run Code Online (Sandbox Code Playgroud)

我尝试从基础扩展宏:

Base.@show(f::friendly) = f.string * " :)"
Run Code Online (Sandbox Code Playgroud)

但是出现以下错误:

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
Run Code Online (Sandbox Code Playgroud)

fre*_*kre 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 :)
Run Code Online (Sandbox Code Playgroud)

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

julia> f = Friendly("Hi")
Hi :)
Run Code Online (Sandbox Code Playgroud)