模块
简介
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