如何将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
答案 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 :)