使用string()的自有类型的julia插值

时间:2015-03-01 12:39:04

标签: julia

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

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

使用这些定义,我希望只要将 Thomas 类型的值转换为字符串,就会调用 string(:: 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粘贴,提交bef6bf3 *,x86_64-linux-gnu)

3 个答案:

答案 0 :(得分:2)

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

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

Base.show(io::IO, x::Thomas) = print(io, "Thomas with $(x.t)")

请注意,在类型的定义中,您应该使用具体类型Int(相当于Int64Int32,具体取决于您机器的字大小),而不是抽象类型Integer,这将导致糟糕的表现。

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

答案 1 :(得分:1)

您必须实际覆盖两个版本的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。

答案 2 :(得分:0)

您可能还想覆盖show方法。

Base.show(io::IO, x::Thomas) = show(io, string(x))