Сделать новое определение типа совместимым со всеми модулями - PullRequest
1 голос
/ 14 апреля 2019

Я работаю над несколько большим проектом (около 2000 строк), и для лучшей организации кода я хотел разделить свои функции на модули, каждый из которых был в отдельном файле.

Большинство моих функций принимают в качестве аргумента переменную пользовательского типа Typ, определение которой велико, и я также хотел поместить ее в отдельный файл type.jl.

Проблема в том, что когда я пытаюсь создать модуль module1, если я просто делаю include("type.jl"), модуль создает свою собственную версию кода в type.jl и создает тип module1.Typ, и это Тип нельзя использовать в качестве аргумента для функций другого модуля module2.

Моя идея для решения этой проблемы заключается в определении типа Typ для Base, чтобы все модули могли обращаться к одному типу и определять функции над ним. В конце концов я хочу иметь следующую структуру.

В файле type.jl

struct Typ
   xs::Array{Int64,1}
   ys::Array{Int64,1}
   Typ(xs,ys) = new(xs,ys)
end

В файле module1.jl:

module module1
   function func1(x::Typ)
      return length(x.xs)
   end
end

В файле module2.jl:

module module2
   function func2(x::Typ)
      return length(x.ys)
   end
end

И возможность запустить все это в файле с именем main.jl

include("type.jl")
include("module1.jl")
include("module2.jl")
b = Typ([0,0],[1,1])
module1.function1(b)
module2.function2(b)

Я пытался использовать Base.include(Base,"type.jl") до объявления модуля, но он не работает.

Единственное решение, которое я нашел, - не создавать модули, а просто определять функции внутри файлов. Это работает, но для отладки и внесения изменений в будущем я бы предпочел иметь структуру модуля, поскольку она позволяет мне иметь идентификатор для каждой функции, файл которого содержит ее определение.

1 Ответ

1 голос
/ 14 апреля 2019

Самое простое, что нужно сделать, это сделать следующее:

module module1
   import ..Typ
   function func1(x::Typ)
      return length(x.xs)
   end
end

(и все будет работать, если вы загрузите файл type.jl ранее)

.. сообщает Юлииищите определение Typ в модуле, включающем данный модуль.

...