在Julia中创建自定义类型

在Julia中创建自定义类型,julia,Julia,在Julia中,如何创建自定义类型MyOrderedDictA和MyOrderedDictB,以便: 每个都具有一个OrderdDict的所有功能,并且可以传递给任何接受AbstractDict的函数 它们彼此不同,因此我可以利用多重分派 我怀疑\希望这是直截了当的,但还没有弄清楚。其他人会更好地回答这个问题,但请快速回答: 为此,您需要查看orderedict实现,特别是为orderedicts定义了哪些方法。如果您想将它传递给接受AbstractDicts的方法,您需要像struct MyD

在Julia中,如何创建自定义类型
MyOrderedDictA
MyOrderedDictB
,以便:

  • 每个都具有一个
    OrderdDict
    的所有功能,并且可以传递给任何接受
    AbstractDict
    的函数
  • 它们彼此不同,因此我可以利用多重分派

  • 我怀疑\希望这是直截了当的,但还没有弄清楚。

    其他人会更好地回答这个问题,但请快速回答:


  • 为此,您需要查看
    orderedict
    实现,特别是为
    orderedict
    s定义了哪些方法。如果您想将它传递给接受
    AbstractDict
    s的方法,您需要像
    struct MyDictA{T,s}一样对它进行子类型化,基本上,您需要做的是定义您的类型
    MyOrderedDictA
    ,包装一个常规的
    OrderedDict
    ,并将可应用于
    OrderedDict
    的所有函数转发到此包装的dict

    不幸的是,(据我所知,
    AbstractDict
    目前还没有文档化(参见
    AbstractArray
    )。您可以查看它们的定义并检查为它们定义了哪些函数。或者,更实用的方法是只使用
    MyOrderedDictA
    ,每当您收到错误消息时,由于未定义函数,您可以“动态”转发此函数

    在任何情况下,使用中的宏
    @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)
    
    使用Lazy
    结构myOrderedPicta{T,S}1,1=>2)
    
    请参阅:请注意,如果您想创建一个新类型,其行为完全与OrderedDict相同,只是为了调度目的,您可能做了一些不太理想的事情。此外,此线程可能会对您有所帮助:Julia Discussion线程上的OP想要做的正是我想做的,尽管我认为他提出的问题比我提出的要好。但我认为创建传递类型很容易,这似乎是错误的。我将尝试@crstnbr建议的方法,但如果你认为我在做一些次优的事情,那么你可能是正确的。