Создание пользовательских типов в Юлии - PullRequest
2 голосов
/ 09 ноября 2019

В Julia, как мне создать пользовательские типы MyOrderedDictA и MyOrderedDictB, такие, что:

  1. Каждый имеет все функции OrderdDict и может быть передан любой функции, котораяпринимает AbstractDict s
  2. Они отличаются друг от друга, так что я могу использовать несколько отправлений.

Я подозреваю \ надеюсь, что это просто, но не былов состоянии понять это.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2019

По сути, вам нужно определить ваш тип MyOrderedDictA, обернуть обычный OrderedDict и перенаправить все функции, которые можно применить к OrderedDict, к этому упакованному дикту.

К сожалению, AbstractDict интерфейс (насколько мне известно) в настоящее время не документирован (см. AbstractArray). Вы можете посмотреть на их определение и проверить, какие функции для них определены. В качестве альтернативы, существует более практичный подход - просто использовать MyOrderedDictA, и всякий раз, когда вы получаете сообщение об ошибке, поскольку функция не определена, вы отправляете эту функцию «на лету».

В любомВ этом случае, используя макрос @forward из Lazy.jl , вы можете сделать что-то вроде следующего:

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)
0 голосов
/ 09 ноября 2019

Другие будут лучше подготовлены, чтобы ответить на этот вопрос, но быстрое решение:

  1. . Для этого вам нужно взглянуть на реализацию OrderedDict и, в частности, какие методы определены дляOrderedDict s. Если вы хотите иметь возможность передавать его методам, принимающим AbstractDict s, вам нужно подтипить его, например, struct MyDictA{T, S} <: AbstractDict{T, S}

  2. Если вы определите две структуры, они будут автоматически отделяться друг от друга. !? (Я мог бы неправильно понять вопрос здесь)

...