【问题标题】:How can I add a constructor to a type alias in Julia?如何在 Julia 中将构造函数添加到类型别名?
【发布时间】:2017-03-26 07:09:39
【问题描述】:

我有一个类型Milkshake,其中包含一个flavor 字段。我想要另一种类型,Order,它只包含Milkshakes 的列表;因此,我使用了typealias

julia> VERSION
v"0.5.1"

julia> type Milkshake
           flavor::String
       end

julia> typealias Order Array{Milkshake, 1}
Array{Milkshake,1}

julia> Order([Milkshake("Chocolate"), Milkshake("Vanilla")])
2-element Array{Milkshake,1}:
 Milkshake("Chocolate")
 Milkshake("Vanilla")  

不过,我想向Order 添加一个构造函数,这样我就可以通过简单地使用flavor 字符串来初始化一个订单。但是,当我尝试定义执行此操作的构造函数时,definition 奇怪地返回类型 Array{Milkshake, 1}

julia> Order(milkshakes::String...) = Order(map(Milkshake, milkshakes))
Array{Milkshake,1}

运行时出现如下错误。

julia> Order("chocolate", "vanilla")
ERROR: MethodError: Cannot `convert` an object of type Tuple{Milkshake,Milkshake} to an object of type Array{Milkshake,1}
This may have arisen from a call to the constructor Array{Milkshake,1}(...),
since type constructors fall back to convert methods.
 in Array{Milkshake,1}(::String, ::String) at ./REPL[3]:1

如何将此构造函数添加到Order typealias

【问题讨论】:

  • Order(milkshakes::String...) = Order(map(Milkshake,[milkshakes...])) 有效吗?
  • @DanGetz 所以这就是错误的来源!抱歉,我应该注意到错误所暗示的内容。您介意将其发布为答案吗? (顺便说一下,collect 可能是[milkshakes...] 的更好替代品。)
  • 这确实令人困惑。但也许 Order 类型应该包裹 Array{Milkshake},因为重新定义 Array 构造函数可能会破坏其他东西。
  • @DanGetz 重新定义 Array{Milkshake, 1} 构造函数特别不应该破坏其他东西......应该吗?
  • 不确定是否损坏,但如何定义Base.convert(::Type{Milkshake},s::String) = Milkshake(s)。现在,具有字符串的相同构造函数可以工作,即Order(["Chocolate","Vanilla"]),因为数组初始化的工作方式。感觉更像 Julia 风格。

标签: constructor julia type-alias


【解决方案1】:

Order(milkshakes::String...) = Order(map(Milkshake,collect(milkshakes))) 有效。

定义后,订单可以如下构造:

julia> Order("Chocolate","Vanilla")
2-element Array{Milkshake,1}:
 Milkshake("Chocolate")
 Milkshake("Vanilla")  

【讨论】:

  • Order(milkshakes::String...) = [Milkshake(shake) for shake in milkshakes] 性能更好,对我来说似乎更简单。
猜你喜欢
  • 2014-03-20
  • 2012-04-05
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
相关资源
最近更新 更多