在Julia中创建自定义类型

时间:2019-11-09 12:57:33

标签: julia

在Julia中,我如何创建自定义类型MyOrderedDictAMyOrderedDictB,如下所示:

  1. 每个功能都具有OrderdDict的所有功能,并且可以传递给接受AbstractDict的任何功能
  2. 它们彼此不同,所以我可以利用多个调度。

我怀疑\希望这很简单,但是还没弄清楚。

2 个答案:

答案 0 :(得分:0)

其他人可以更好地回答这个问题,但是要快速采取行动:

  1. 为此,您需要查看OrderedDict的实现,尤其是为OrderedDict定义了哪些方法。如果您希望将其传递给接受AbstractDict的方法,则需要像struct MyDictA{T, S} <: AbstractDict{T, S}

  2. 如果您定义两个结构,它们将自动彼此分离! (我可能在这里误解了这个问题)

答案 1 :(得分:0)

基本上,您需要做的是定义类型MyOrderedDictA,包装常规的OrderedDict,并将可以应用于OrderedDict的所有函数转发给该包装的字典。

不幸的是,据我所知,AbstractDict interface目前尚未记录(参见AbstractArray)。您可以查看它们的定义并检查为它们定义了哪些功能。另外,还有一种更实用的方法是只使用MyOrderedDictA,并且每当收到错误消息时,由于未定义函数,因此您可以“即时”转发此函数。

无论如何,使用Lazy.jl中的宏@forward,您可以按照以下内容进行操作。

using Lazy

struct MyOrderedDictA{T,S} <: AbstractDict{T,S}
    dict::OrderedDict{T,S}
end

MyOrderedDictA{T,S}(args...; kwargs...) where {T,S} = new{T,S}(OrderedDict{T,S}(args...; kwargs...))

function MyOrderedDictA(args...; kwargs...)
    d = OrderedDict(args...; kwargs...)
    MyOrderedDictA{keytype(d),valtype(d)}(d)
end

@forward MyOrderedDictA.dict (Base.length, Base.iterate, Base.getindex, Base.setindex!)

d = MyOrderedDictA(2=>1, 1=>2)