Учебники

D Программирование — Модули

Модули являются строительными блоками D. Они основаны на простой концепции. Каждый исходный файл является модулем. Соответственно, отдельные файлы, в которые мы пишем программы, являются отдельными модулями. По умолчанию имя модуля совпадает с именем файла без расширения .d.

При явном указании имя модуля определяется ключевым словом module, которое должно отображаться как первая строка без комментариев в исходном файле. Например, предположим, что имя исходного файла — «employee.d». Затем имя модуля указывается ключевым словом модуля, за которым следует сотрудник . Это как показано ниже.

module employee;

class Employee {
   // Class definition goes here. 
}

Линия модуля является необязательной. Если не указано, оно совпадает с именем файла без расширения .d.

Имена файлов и модулей

D поддерживает 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 { }

Поскольку имена пакетов соответствуют именам каталогов, имена пакетов модулей, которые находятся глубже одного уровня каталогов, должны отражать эту иерархию. Например, если каталог «company» включает каталог «branch», имя модуля внутри этого каталога также будет включать в себя филиал.

module company.branch.employee;

Использование модулей в программах

Ключевое слово import, которое мы использовали почти во всех программах, предназначено для введения модуля в текущий модуль —

import std.stdio;

Имя модуля также может содержать имя пакета. Например, станд. часть выше указывает, что stdio является модулем, который является частью пакета std.

Расположение модулей

Компилятор находит файлы модуля путем преобразования имен пакетов и модулей непосредственно в имена каталогов и файлов.

Например, два модуля employee и office будут расположены как «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();

Длинные имена обычно не нужны, но иногда возникают конфликты имен. Например, при обращении к имени, которое появляется в более чем одном модуле, компилятор не может решить, какое из них имеется в виду. В следующей программе прописаны длинные имена, позволяющие различать две отдельные структуры сотрудников , которые определены в двух отдельных модулях: компания и колледж. ,

Первый сотрудник модуля в папке компании выглядит следующим образом.

module company.employee; 
 
import std.stdio;
  
class Employee {
   public: 
      string str; 

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

Второй сотрудник модуля в папке колледжа работает следующим образом.

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».

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —