julia 图形界面设计(我爱Julia之入门-108模块)

模块

模块是 Julia 的组织结构,不同的模块构成了相互隔离的变量工作区。其定义方法如下。

module 模块名 # 模块内容 end

类似于命名空间,模块中除了变量外,还可以声明或定义常量、类型、函数等,从而实现功能的组织划分,便于维护和发布。而且,在模块中可以引入其他外部模块,从而能使用其中已经定义好的对象,也可以显式地导出对象,提供给外部使用。

julia 图形界面设计(我爱Julia之入门-108模块)(1)

注意,模块中的代码样式不需要缩进,否则的话,会导致整个文件缩进。

上面的模块定义了一个 MyType 类型,以及两个函数,其中,函数 foo 和类型 MyType 被导出了,因而可以被导入到其它模块,而函数 bar 是模块 MyModule 的私有函数。

using Lib 意味着一个名称为 Lib 的模块会在需要的时候用于解释变量名。当一个全局变量在当前模块中没有定义时,系统就会从 Lib 中导出的变量中搜索该变量,如果找到了的话,就导入进来。也就是说,当前模块中,所有使用该全局变量的地方都会解释为 Lib 中对应的变量。

代码 using BigLib: thing1, thing2 显式地将标识符 thing1 和 thing2 从模块 BigLib 中引入到当前作用域。如果这两个变量是函数的话,则不允许给它们增加新的方法,毕竟代码里写的是 "using"(使用)它们,而不是扩展它们。

import 关键字所支持的语法与 using 一致,不过一次只作用于一个名字。此外它并不会像 using 那样将模块添加到搜索空间中,与 using 不同,import 引入的函数可以为其增加新的方法。

前面的 MyModule 模块中,我们希望给 show 函数增加一个方法,于是需要写成 import Base.show,这里如果写成 using 的话,就不能扩展 show 函数。

一旦一个变量通过 using 或 import 引入,当前模块就不能创建同名的变量了。而且导入的变量是只读的,给全局变量赋值只能影响到由当前模块拥有的变量,否则会报错。

模块的引入

下面我们再以一个具体的例子说明各种引入方式的区别。

module MyModule export x, y x() = "x" y() = "y" p() = "p" end

其中,模块 MyModule 定义了三个函数,并用关键字 export 导出了 x 和 y 函数,此外还有一个没有被导出的函数 p。

julia 图形界面设计(我爱Julia之入门-108模块)(2)

无论用哪种方式引入了其他模块的名字,该名字便出现在当前模块的名字空间内,所以不能再重复使用。

在引入名字的过程中,有两类名字比较特别:

  • 一个运算符,Base. ,由于会出现语法歧义,所以必须使用 Base.: 来引用它。如果运算符的字符不止一个,则必须用括号括起来,例如:Base.:(==)。
  • 宏名称在导入和导出语句中用 @ 编写,例如:import Mod.@mac。其它模块中的宏可以用 Mod.@mac 或 @Mod.mac 触发。

在 Julia 中是不允许使用 M.x = y 这种写法给另一个模块中的全局变量赋值;必须在模块内部才能进行全局变量的赋值。因为这样可能会给其他模块带来灾难性的后果。

标准模块

Julia 有三个非常重要的标准模块:Main,Core 和 Base

Main 是最顶层的模块,Julia 启动后会将 Main 设置为当前模块。Julia 的 REPL 便处在该模块中,所以在 REPL 中定义的变量会进入到 Main,执行 varinfo() 会列出 Main 中的变量。

Core 包含所有语言内置的标识符(语言的核心部分,不是库),每个模块都默认声明了 using Core(否则的话啥也做不了)。

Base 模块包含了一些基本的功能(即源码中 base/ 目录下的内容)。所有模块都默认包含了 using Base,因为对大多数库来说,都会用到。

julia 图形界面设计(我爱Julia之入门-108模块)(3)

如上图列出了 Main 中的所有名字,我们可以从中看出 Main 模块自动引入了 Core 和 Base 模块。而且在定义了 x 和 y 两个变量后,它们也加入到该模块中。除了默认包含 using Base 之外,所有模块都还包含 eval 和 include 函数。这两个函数用于将表达式和文件引入到全局作用域中。

默认顶层定义以及裸模块

除了默认包含 using Base 之外,所有模块都还包含 eval 和 include 函数。这两个函数用于将表达式和文件引入到全局作用域中。

如果这些默认的定义都不需要,那么可以用 baremodule 定义裸模块(不过 Core 模块仍然会被引入,否则啥也干不了)。用裸模块表达的标准模块定义如下:

julia 图形界面设计(我爱Julia之入门-108模块)(4)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页