模块
简介
Julia 中的模块(module)是一些互相隔离的可变工作空间,会引入新的全局作用域。模块允许创建顶层定义(也称为全局变量),而无需担心命名冲突。 在模块中,利用导入(importing)控制其它模块中的哪些名称是可见的;利用导出(exporting)控制自己的模块中哪些名称是公开的。
模块的类型名是 Module。
标准模块
Core包含了语言内置的所有功能Base包含了绝大多数情况下都会用到的基本功能Main是顶层模块,当 julia 启动时,也是当前模块
当前模块
在使用时,你需要搞清楚当前模块的位置。模块中的所有代码,若无特别标注,都是作用于当前模块的。
可以利用 @__MODULE__ 获取当前模块名
语法
使用 module ... end 声明一个模块,它会默认导入 Base 和 Core(特别地,可以使用 baremodule ... end 从而不导入 Base,也不在本地定义 eval 和 include)。
在脚本中,通常不因为定义模块而缩进,因为这会产生大量缩进。
基础示例:
julia> module Foo
export Bar
module Bar # 模块可以嵌套
greet()=println("Hello!")
end
end
Main.Foo
julia> N=Foo # 模块也可以这样赋值
Main.Foo
julia> N
Main.Foo
julia> typeof(N)
Module
julia> N.Bar.greet()
Hello!
导出
使用 export x1,x2 标注导出 x1 与 x2。在模块中,可以有一个或多个 export 语句。 需注意的是,无法导出函数的指定方法。
导入
import Foo导入Foo模块,在调用时需使用Foo.x(3)import Foo.x,y导入Foo中的x和y,可直接使用x(3)import FastOnlineOpen as Foo在调用时使用Foo简写using Foo导入Foo模块,在调用时若无歧义可以使用x(3)using Foo.Bar:a,b导入Foo的子模块Bar中的a和b
重载
重载其它模块中的函数示例
julia> module X
export q
q(x::Int)=x
end
Main.X
julia> using Main.X
julia> X.q(x::Int)=x+1
julia> q(2)
3