跳转到内容

D (编程语言)/d2/模块

50% developed
来自维基教科书,自由的教科书

第 6 课:模块

[编辑 | 编辑源代码]

在本课中,您将了解 D 的模块系统。模块是包含变量、函数和其他 D 结构定义的代码单元,这些代码单元属于一起。这对于创建可重用代码很有用。您在每一课中都看到了模块。事实上,所有 D 源文件都是模块。stdio 模块包含像 writeln 这样的函数。stdio 模块写在名为 stdio.d 的文件中,位于dmd/src/phobos/std/stdio.d。它包含对控制台输入输出和文件输入输出有用的代码。它位于名为std中,其中还包含其他模块,如 std.algorithmstd.string,您将在以后学习。Phobos 库只是随 D 编译器一起提供的一个大型模块集合。

入门代码

[编辑 | 编辑源代码]
// main.d
module main;

import std.stdio;
import module1;
import byebye : sayBye;
 
void main()
{
    happy();
    writeln("Mothers Day!");
    sayBye();
    // sayByeInItalian(); undefined identifier 'sayByeInItalian'
}
// happy.d
module module1;

import std.stdio;

void happy()
{
    write("Happy ");
}

private void sad()
{
    write("Who gives a darn about ");
}

private:
void mad() { }
void bad() { }
//bye.d
module byebye;
import std.stdio;

void sayBye()
{
    writeln("Goodbye!");
}

void sayByeInItalian()
{
   writeln("Arrivederci");
}

像这样编译:dmd main.d happy.d bye.d

深入了解导入

[编辑 | 编辑源代码]

所有 D 代码都在模块内。在 D 程序中,必须有一个包含main 函数的模块。如果一个模块导入另一个模块,则被导入模块的定义将对第一个模块可用。在入门代码中,main 模块导入了另外两个模块:module1byebye。但是,当导入byebye 时,只导入了一个函数:sayBye 函数。该语法为import modulename : identifier1, identifier2, identifier3;

模块声明

[编辑 | 编辑源代码]

D 源文件可以使用模块声明来指定模块的名称以及它所属的包,该声明位于开头。例如,在stdio 模块中,有以下行

module std.stdio;

该行指定了模块的名称(stdio)以及它所在的包(std)。每个源文件最多只能有一个模块声明。如果没有,则源文件名(不带扩展名)将成为模块名称。

可见性

[编辑 | 编辑源代码]

module1sad 定义中的void 之前,您看到了修饰符private。这意味着sad 函数无法导入。您也不能执行import module1 : sad。如果您看到一行说private:,则该行下面的所有内容都是private。同样,如果您看到private { } ,则大括号内的所有内容都是 private。

  • 模块的名称不必与该模块内的定义的名称相关。
  • 模块的名称不必与文件名相关。
  • 还有一个public 修饰符,它与private 修饰符相反。既没有用public 标记也没有用private 标记的声明默认情况下是public 的。
  • 所有 D 源文件都是模块,即使文件中没有模块声明。
华夏公益教科书