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