使用 string() 对自己类型进行 Julia 插值

fil*_*kus 2 julia

我对 Julia 还很陌生,我正在考虑将一些 Python 代码移植到 Julia。此代码使用 __repr__() 重载来显示 cutsom 类型。据我了解,Julia为该功能提供了string () 方法。但我无法弄清楚。

julia> type Thomas
         t::Integer
       end 
julia> function Base.string(t::Thomas)
         "---> $(t.t) <---"
       end
julia> r = Thomas(8);
Run Code Online (Sandbox Code Playgroud)

通过这些定义,我希望只要Thomas类型的值需要转换为字符串,就会调用string(::Thomas)函数。在一种情况下,它按预期工作:

julia> println("$r")
---> 8 <---
Run Code Online (Sandbox Code Playgroud)

但是,在大多数情况下,它不会:

julia> println(r)
Thomas(8)

julia> println(" $r")
 Thomas(8)

julia> println("r = $r")
r = Thomas(8)

julia> repr(r)
"Thomas(8)"
Run Code Online (Sandbox Code Playgroud)

我做错了什么?我还应该为新的自定义类型定义其他函数吗?

我正在运行 Julia 0.4.0-dev。(上面的代码粘贴自0.4.0-dev+3607版本的REPL(2015-02-26 07:41 UTC),Commit bef6bf3*, x86_64-linux-gnu)

Dav*_*ers 5

目前,只需覆盖Base.show就足够了,如下所示。

type Thomas
    t::Int   # note Int not Integer
end

Base.show(io::IO, x::Thomas) = print(io, "Thomas with $(x.t)")
Run Code Online (Sandbox Code Playgroud)

请注意,在类型的定义中,您应该使用具体类型Int(相当于Int64Int32,取决于您机器的字长),而不是抽象类型Integer,这会导致性能不佳。

Base.show等的情况Base.print目前确实令人困惑,但通过最近的一些工作(查找IOContext)应该很快就会得到简化和澄清。