D (编程语言)/d2/模块
在本课中,您将了解 D 的模块系统。模块是包含变量、函数和其他 D 结构定义的代码单元,这些代码单元属于一起。这对于创建可重用代码很有用。您在每一课中都看到了模块。事实上,所有 D 源文件都是模块。stdio
模块包含像 writeln
这样的函数。stdio
模块写在名为 stdio.d 的文件中,位于dmd/src/phobos/std/stdio.d
。它包含对控制台输入输出和文件输入输出有用的代码。它位于名为std
的包中,其中还包含其他模块,如 std.algorithm
或 std.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
模块导入了另外两个模块:module1
和 byebye
。但是,当导入byebye
时,只导入了一个函数:sayBye 函数。该语法为import modulename : identifier1, identifier2, identifier3;
。
D 源文件可以使用模块声明来指定模块的名称以及它所属的包,该声明位于开头。例如,在stdio
模块中,有以下行
module std.stdio;
该行指定了模块的名称(stdio
)以及它所在的包(std
)。每个源文件最多只能有一个模块声明。如果没有,则源文件名(不带扩展名)将成为模块名称。
在module1
中sad
定义中的void
之前,您看到了修饰符private
。这意味着sad
函数无法导入。您也不能执行import module1 : sad
。如果您看到一行说private:
,则该行下面的所有内容都是private
。同样,如果您看到private { }
,则大括号内的所有内容都是 private。
- 模块的名称不必与该模块内的定义的名称相关。
- 模块的名称不必与文件名相关。
- 还有一个
public
修饰符,它与private
修饰符相反。既没有用public
标记也没有用private
标记的声明默认情况下是public
的。 - 所有 D 源文件都是模块,即使文件中没有模块声明。