我是Julia的新手,我正在考虑将一些Python代码移植到Julia。此代码使用__repr_()重载来显示cutsom类型。据我所知,Julia为该功能提供了字符串()方法。但我想不通。
julia> type Thomas
t::Integer
end
julia> function Base.string(t::Thomas)
"---> $(t.t) <---"
end
julia> r = Thomas(8);
有了这些定义,我希望每当需要将Thomas类型的值转换为字符串时,都会调用我的字符串(::Thomas)函数。在一种情况下,它按预期工作:
julia> println("$r")
---> 8 <---
但是,在大多数情况下,情况并非如此:
julia> println(r)
Thomas(8)
julia> println(" $r")
Thomas(8)
julia> println("r = $r")
r = Thomas(8)
julia> repr(r)
"Thomas(8)"
我做错了什么?我应该为我的新自定义类型定义其他函数吗?
我正在运行Julia 0.4.0-dev。(上面的代码是从版本0.4.0-dev+3607(2015-02-26 07:41 UTC)的REPL粘贴而来的,Commit bef6bf3*,x86_64-linux-gnu)
目前只覆盖Base.show
就足够了,如下所示。
type Thomas
t::Int # note Int not Integer
end
Base.show(io::IO, x::Thomas) = print(io, "Thomas with $(x.t)")
请注意,在类型的定义中,应该使用具体类型Int
(相当于Int64
或Int32
,具体取决于您机器的字大小),而不是抽象类型Integer
,这会导致性能不佳。
Base.show
、Base.print
等的情况目前确实令人困惑,但随着最近的一些工作(查阅IOContext
),应该很快得到简化和澄清。
您必须重写Base.print的两个版本才能获得一致的字符串插值行为:
Base.print(io::IOBuffer, t::Thomas) = Base.print(io, "---> $(t.t) <---")
Base.print(t::Thomas) = Base.print("---> $(t.t) <---")
然后你会有:
print(t)
string(t)
string(t, t, ...)
"$t"
"t = $t"
"$t $t $t"
和co.
您可能还需要覆盖show
方法。
Base.show(io::IO, x::Thomas) = show(io, string(x))