D-programming-modules

提供:Dev Guides
移動先:案内検索

Dプログラミング-モジュール

モジュールはDの構成要素です。 それらは単純な概念に基づいています。 すべてのソースファイルはモジュールです。 したがって、プログラムを記述する単一のファイルは個々のモジュールです。 デフォルトでは、モジュールの名前は拡張子.dを除いたファイル名と同じです。

明示的に指定された場合、モジュールの名前はmoduleキーワードで定義され、ソースファイルの最初の非コメント行として表示される必要があります。 たとえば、ソースファイルの名前が「employee.d」であるとします。 次に、モジュールの名前は、_module_キーワードに続いて_employee_で指定されます。 以下のとおりです。

module employee;

class Employee {
  //Class definition goes here.
}

モジュール行はオプションです。 指定しない場合、.d拡張子のないファイル名と同じです。

ファイル名とモジュール名

Dは、ソースコードとモジュール名でUnicodeをサポートします。 ただし、ファイルシステムのUnicodeサポートは異なります。 たとえば、ほとんどのLinuxファイルシステムはUnicodeをサポートしていますが、Windowsファイルシステムのファイル名では小文字と大文字が区別されない場合があります。 さらに、ほとんどのファイルシステムでは、ファイル名およびディレクトリ名に使用できる文字が制限されています。 移植性の理由から、ファイル名には小文字のASCII文字のみを使用することをお勧めします。 たとえば、「employee.d」は、従業員という名前のクラスに適したファイル名です。

したがって、モジュールの名前もASCII文字で構成されます-

module employee; //Module name consisting of ASCII letters

class eëmployëë { }

Dパッケージ

関連モジュールの組み合わせはパッケージと呼ばれます。 Dパッケージも単純な概念です。同じディレクトリ内にあるソースファイルは、同じパッケージに属すると見なされます。 ディレクトリの名前はパッケージの名前になります。パッケージの名前は、モジュール名の最初の部分としても指定する必要があります。

たとえば、「employee.d」と「office.d」がディレクトリ「company」内にある場合、モジュール名とともにディレクトリ名を指定すると、それらは同じパッケージの一部になります-

module company.employee;

class Employee { }

同様に、オフィスモジュールの場合-

module company.office;

class Office { }

パッケージ名はディレクトリ名に対応するため、1つのディレクトリレベルよりも深いモジュールのパッケージ名は、その階層を反映する必要があります。 たとえば、「company」ディレクトリに「branch」ディレクトリが含まれている場合、そのディレクトリ内のモジュールの名前にもbranchが含まれます。

module company.branch.employee;

プログラムでのモジュールの使用

これまでほとんどすべてのプログラムで使用してきたimportキーワードは、現在のモジュールにモジュールを導入するためのものです-

import std.stdio;

モジュール名にはパッケージ名も含まれる場合があります。 たとえば、std。 上記の部分は、stdioがstdパッケージの一部であるモジュールであることを示しています。

モジュールの場所

コンパイラは、パッケージ名とモジュール名をディレクトリ名とファイル名に直接変換することにより、モジュールファイルを見つけます。

たとえば、従業員とオフィスの2つのモジュールは、それぞれ「company/employee.d」と「animal/office.d」(または、「company \ employee.d」と「company \ office.d」に応じて、 company.employeeおよびcompany.officeのファイルシステム)。

長いモジュール名と短いモジュール名

プログラムで使用される名前は、以下に示すようにモジュール名とパッケージ名で綴られている場合があります。

import company.employee;
auto employee0 = Employee();
auto employee1 = company.employee.Employee();

通常、長い名前は必要ありませんが、名前の競合が発生する場合があります。 たとえば、複数のモジュールに表示される名前を参照する場合、コンパイラはどちらを意味するかを決定できません。 次のプログラムは、2つの個別のモジュールで定義されている2つの個別の_employee_構造体を区別するために、長い名前を綴っています:company_および_college.

フォルダcompanyの最初の従業員モジュールは次のとおりです。

module company.employee;

import std.stdio;

class Employee {
   public:
      string str;

   void print() {
      writeln("Company Employee: ",str);
   }
}

フォルダカレッジの2番目の従業員モジュールは次のとおりです。

module college.employee;

import std.stdio;

class Employee {
   public:
      string str;

   void print() {
      writeln("College Employee: ",str);
   }
}

hello.dのメインモジュールは、collegeおよびcompanyフォルダーを含むフォルダーに保存する必要があります。 以下の通りです。

import company.employee;
import college.employee;

import std.stdio;

void main() {
   auto myemployee1 = new company.employee.Employee();
   myemployee1.str = "emp1";
   myemployee1.print();

   auto myemployee2 = new college.employee.Employee();
   myemployee2.str = "emp2";
   myemployee2.print();
}

importキーワードは、モジュールをプログラムの一部にするには不十分です。 現在のモジュール内のモジュールの機能を利用できるようにします。 それだけがコードをコンパイルするために必要です。

上記のプログラムをビルドするには、「company/employee.d」と「college/employee.d」もコンパイル行で指定する必要があります。

上記のコードをコンパイルして実行すると、次の結果が生成されます-

$ dmd hello.d company/employee.d college/employee.d -ofhello.amx
$ ./hello.amx
Company Employee: emp1
College Employee: emp2