.. _modules: ======= 模块 ======= 模块提供代码重用的基础结构,以及向 Daslang 公开 C++ 功能的机制。 模块是类型、常量和函数的集合。 模块可以是 Daslang 原生的,也可以是内置的。 要请求一个模块,请使用 ``require`` 关键字:: require math require ast public require daslib/ast_boost ``public`` 修饰符表示包含的模型对包括当前模块在内的所有内容都是可见的。 模块名称可能包含 ``/`` 和 ``.`` 符号。 项目负责将模块名称解析为文件名(参阅 :ref:`Project `). -------------- 原生模块 -------------- 原生模块是一个单独的 Daslang 文件,具有可选的 ``module`` 名称:: module custom // 指定模块名称 ... def foo // 在模块中定义函数 ... 如果未指定,则模块名称默认为文件名的名称。 模块可以是 `private` 或 `public`:: module Foo private module Foo public 函数、结构或枚举的默认公开是模块的公开(即,如果模块是公共的并且未指定函数的公开,则该函数是公共的)。 --------------- 内置模块 --------------- 内置模块是向 Daslang 公开 C++ 功能的方式 (参阅 :ref:`Builtin modules `). -------------- 共享模块 -------------- 共享模块是在多个上下文的编译之间共享的模块。 通常,每个上下文都会重新编译模块,但是当指定 'shared' 关键字时,模块会提升为内置模块:: module Foo shared 这样,每个编译环境只创建一个模块实例。 共享模块中的宏不能期望模块是唯一的,因为可以通过策略代码禁用模块的共享。 -------------------------- 模块函数可见性 -------------------------- 调用函数时,可以显式或隐式指定模块的名称:: 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`` 调用所取代。