2.14. 模块
模块提供代码重用的基础结构,以及向 Daslang 公开 C++ 功能的机制。 模块是类型、常量和函数的集合。 模块可以是 Daslang 原生的,也可以是内置的。
要请求一个模块,请使用 require
关键字:
require math
require ast public
require daslib/ast_boost
public
修饰符表示包含的模型对包括当前模块在内的所有内容都是可见的。
模块名称可能包含 /
和 .
符号。
项目负责将模块名称解析为文件名(参阅 Project).
2.14.1. 原生模块
原生模块是一个单独的 Daslang 文件,具有可选的 module
名称:
module custom // 指定模块名称
...
def foo // 在模块中定义函数
...
如果未指定,则模块名称默认为文件名的名称。
模块可以是 private 或 public:
module Foo private
module Foo public
函数、结构或枚举的默认公开是模块的公开(即,如果模块是公共的并且未指定函数的公开,则该函数是公共的)。
2.14.2. 内置模块
内置模块是向 Daslang 公开 C++ 功能的方式 (参阅 Builtin modules).
2.14.3. 共享模块
共享模块是在多个上下文的编译之间共享的模块。 通常,每个上下文都会重新编译模块,但是当指定 ‘shared’ 关键字时,模块会提升为内置模块:
module Foo shared
这样,每个编译环境只创建一个模块实例。 共享模块中的宏不能期望模块是唯一的,因为可以通过策略代码禁用模块的共享。
2.14.4. 模块函数可见性
调用函数时,可以显式或隐式指定模块的名称:
let s1 = sin(0.0) // implicit, assumed math::sin
let s2 = math::sin(0.0) // explicit, always math::sin
如果该模块中不存在该函数,则会发生编译错误。 如果函数是私有的或不直接可见的,则会发生编译错误。 如果多个函数匹配隐式函数,则会出现编译错误。
模块名称 _
和 __
保留用于分别指定 ‘当前模块’ 和 ‘仅当前模块’。
它对于泛型函数尤其重要,这些函数在当前模块中总是实例化为私有函数:
module b
[generic]
def from_b_get_fun_4() {
return _::fun_4() // call `fun_4', as if it was implicitly called from b
}
[generic]
def from_b_get_fun_5() {
return __::fun_5() // always b::fun_5
}
指定空前缀与不指定前缀相同。
如果没有 _
或 __
模块前缀,被覆盖的函数在泛型中将不可见。
这就是为什么 :=
和 delete
作符总是被 _::clone
或 _::finalize
调用所取代。