D(编程语言)/d2/模块
在本课中,您将了解D的模块系统。模块是代码单元,包含变量、函数和其他D结构的定义,这些定义属于一起。这对于创建可重用代码很有用。您在每一课中都见过模块。实际上,所有D源文件都是模块。stdio
模块包含诸如writeln
之类的函数。stdio
模块以dmd/src/phobos/std/stdio.d
路径下的名为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 { }
,则大括号内的所有内容都是私有的。
- 模块的名称不必与该模块内的定义的名称相关。
- 模块的名称不必与文件名相关。
- 还有一个
public
修饰符,它与private
修饰符相反。既没有public
也没有private
标记的声明默认情况下是public
。 - 所有D源文件都是模块,即使文件中没有模块声明。