Т.к. в основной документации Julia нету описания модулей, то сделаю маленький обзор исходя из этого топика рассылки.
Для создания модуля используется следующая конструкция:
module ModuleName
Просто и очевидно.
Теперь рассмотрим такой код:
module HELLO
Должно работать? А вот и нет. Теперь стандартные функции перенесены в модуль Base, который не импортируется по умолчанию, поэтому Julia скажет: "print not defined".
Правильно будет:
module HELLO
import Base.*
Что значит .* в данной записи? А значит оно вот что: "Из модуля Base экспортируются все символы, которые помечены как export". Как использовать export в своих модулях? Элементарно, пример:
module HELLO
import Base.*
export hello
function hello()
print("hello")
end
end
Стоит заметить, что export может находится в любом месте модуля, а не только в начале.
Экспортировать можно и отдельные символы с помощью конструкций вида import Foo.foo.
Так же стоит заметить, что в одном файле исходного кода может быть несколько модулей (в отличие от python).
Следует указать ещё одну интересную возможность модулей - ключевое слово include.
module TEST
import Base.*
include("foo.jl")
include("baz.jl")
end
В модуле TEST будут присутствовать все символы, определяемые в foo.jl и baz.jl. Причём никто не запрещает делать include("some_file.jl") сразу в нескольких модулях.
И ещё один пример:
module T
import Base.*
export t1, t2
function t1()
print("t1")
end
function t2()
print("t2")
end
end
module T2
import T.*
export t2
t1()
end
module Z
import T2.*
t2()
end
А вот Z.t1() будет ошибочно. Почему? Потому что всегда требуется явный экспорт символов.
Для создания модуля используется следующая конструкция:
module ModuleName
#Some code
endПросто и очевидно.
Теперь рассмотрим такой код:
module HELLO
print("hello") # Ошибка!
endДолжно работать? А вот и нет. Теперь стандартные функции перенесены в модуль Base, который не импортируется по умолчанию, поэтому Julia скажет: "print not defined".
Правильно будет:
module HELLO
import Base.*
print("hello")
endЧто значит .* в данной записи? А значит оно вот что: "Из модуля Base экспортируются все символы, которые помечены как export". Как использовать export в своих модулях? Элементарно, пример:
module HELLO
import Base.*
export hello
function hello()
print("hello")
end
end
Стоит заметить, что export может находится в любом месте модуля, а не только в начале.
Экспортировать можно и отдельные символы с помощью конструкций вида import Foo.foo.
Так же стоит заметить, что в одном файле исходного кода может быть несколько модулей (в отличие от python).
Следует указать ещё одну интересную возможность модулей - ключевое слово include.
module TEST
import Base.*
include("foo.jl")
include("baz.jl")
end
В модуле TEST будут присутствовать все символы, определяемые в foo.jl и baz.jl. Причём никто не запрещает делать include("some_file.jl") сразу в нескольких модулях.
И ещё один пример:
module T
import Base.*
export t1, t2
function t1()
print("t1")
end
function t2()
print("t2")
end
end
module T2
import T.*
export t2
t1()
end
module Z
import T2.*
t2()
end
А вот Z.t1() будет ошибочно. Почему? Потому что всегда требуется явный экспорт символов.