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」は、employeeという名前のクラスに適したファイル名です。

したがって、モジュールの名前も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」ディレクトリが含まれている場合、そのディレクトリ内のモジュールの名前にはブランチも含まれます。

module company.branch.employee;

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

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

import std.stdio;

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

モジュールの場所

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

たとえば、employeeとofficeの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つの別々の従業員構造体を区別するために長い名前を綴っています

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

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のメインモジュールは、大学と会社のフォルダーを含むフォルダーに保存する必要があります。以下の通りです。

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