在Julia中,我如何创建自定义类型MyOrderedDictA
和MyOrderedDictB
,如下所示:
OrderdDict
的所有功能,并且可以传递给接受AbstractDict
的任何功能我怀疑\希望这很简单,但是还没弄清楚。
答案 0 :(得分:0)
其他人可以更好地回答这个问题,但是要快速采取行动:
为此,您需要查看OrderedDict
的实现,尤其是为OrderedDict
定义了哪些方法。如果您希望将其传递给接受AbstractDict
的方法,则需要像struct MyDictA{T, S} <: AbstractDict{T, S}
如果您定义两个结构,它们将自动彼此分离! (我可能在这里误解了这个问题)
答案 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)