跳转到内容

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

50% developed
来自维基教科书,开放的书籍,开放的世界

第6课:模块

[编辑 | 编辑源代码]

在本课中,您将了解D的模块系统。模块是代码单元,包含变量、函数和其他D结构的定义,这些定义属于一起。这对于创建可重用代码很有用。您在每一课中都见过模块。实际上,所有D源文件都是模块。stdio 模块包含诸如writeln 之类的函数。stdio模块以dmd/src/phobos/std/stdio.d路径下的名为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 { } ,则大括号内的所有内容都是私有的。

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