Есть ли способ принудительно использовать скрытый конструктор по умолчанию в Джулии? - PullRequest
1 голос
/ 15 июня 2019

Я хочу сериализовать и десериализовать объекты Julia из внешнего пакета. Некоторые из этих объектов имеют только ограниченные внутренние конструкторы, как в следующем примере:

module ExternalModule
  struct SillyType
    f::Float64
    function SillyType(i::Int)
      new(float(i))
    end
  end
end

Чтобы восстановить объекты / структуры из сохраненных значений (здесь, чтобы восстановить SillyType, используя float), мне нужно вызвать конструктор по умолчанию, который недоступен:

julia> ExternalModule.SillyType(2.0)
ERROR: MethodError: no method matching Main.ExternalModule.SillyType(::Float64)

Документация Джулии говорит

Если какой-либо метод внутреннего конструктора определен, конструктор по умолчанию отсутствует метод предоставляется: предполагается, что вы поставили сами со всеми необходимыми внутренними конструкторами.

Есть ли способ обойти это, чтобы принудительно вызвать отсутствующий конструктор по умолчанию? И какой подход был бы наименее грязным для этого?

1 Ответ

4 голосов
/ 16 июня 2019

Я думаю, что функция new во внутреннем конструкторе SillyType - это то, что вы хотите вызвать? Обычно это разрешено только во внутренних конструкторах, но если вы подделаете его с помощью макросов, он все равно будет работать. Попробуйте это:

julia> macro new(args...)
         return Expr(:new, args...)
       end
@new (macro with 1 method)

julia> @new(SillyType, 4.)
SillyType(4.0)
...