【问题标题】:How to display a type alias instead of a parametric type in error messages如何在错误消息中显示类型别名而不是参数类型
【发布时间】:2015-06-02 19:09:55
【问题描述】:

我在 julia 中构建了一个参数类型:

type MyType{T}
    x::T
end

为简单起见,我为Float64 构建了一个类型别名:

typealias MT MyType{Float64}

我现在故意导致涉及MT 的错误。例如:

y1 = MyType(1.0)
y2 = MyType(2.0)
y1 + y2

会抛出一个错误,因为+ 没有为MyType 定义。错误消息说:

`+` has no method matching +(::MyType{Float64}, ::MyType{Float64})

我想说:

`+` has no method matching +(::MT, ::MT)

为什么?因为现实世界的示例有时会比这个玩具示例复杂得多,而类型别名的一个目的是使参数类型的复杂特定实例易于识别。因此,在错误消息中也可以轻松识别它会很好。

我尝试了什么?我最好的猜测是错误函数通过DataType 调用string 函数,以便在错误消息中生成适当的字符串。所以对我来说,我可以通过多次调度扩展 string 函数来专门处理我的类型别名,这对我来说并不明显,所以我几乎不知道从这里去哪里。

【问题讨论】:

  • 我认为 Julia 不可能自己做,因为可能有多个类型别名。我相信你的猜测也是正确的,是的,这似乎是一个死胡同。不过,这并不是一件不合理的事情——我认为 Github 问题将是一个合适的论坛。

标签: julia


【解决方案1】:

你需要定义一个合适的show方法:

import Base.show
show(io::IO, ::Type{MT}) = print(io, "MT")

然后你的例子给出:

julia> y1 + y2
ERROR: `+` has no method matching +(::MT, ::MT)

【讨论】:

  • 我想知道备用typealias 或宏@typealias 是否可以自动执行这些步骤。
  • 太棒了。我希望它会像那样简单。非常感谢!
  • 从 1.6 开始,这将自动发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多