D Программирование - Модули
Модули - это строительные блоки D. Они основаны на простой концепции. Каждый исходный файл - это модуль. Соответственно, отдельные файлы, в которые мы пишем программы, являются отдельными модулями. По умолчанию имя модуля совпадает с его именем файла без расширения .d.
При явном указании имя модуля определяется ключевым словом module, которое должно появиться как первая строка без комментариев в исходном файле. Например, предположим, что имя исходного файла - «employee.d». Затем имя модуля указывается ключевым словом модуля, за которым следует сотрудник . Это как показано ниже.
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 { }
Поскольку имена пакетов соответствуют именам каталогов, имена пакетов модулей, которые находятся на более глубоком уровне, чем один уровень каталогов, должны отражать эту иерархию. Например, если каталог «компания» включает в себя каталог «ветвь», имя модуля внутри этого каталога также будет включать ветку.
module company.branch.employee;
Использование модулей в программах
Ключевое слово import, которое мы до сих пор использовали почти во всех программах, предназначено для введения модуля в текущий модуль -
import std.stdio;
Имя модуля также может содержать имя пакета. Например, std. часть выше указывает, что stdio - это модуль, который является частью пакета std.
Расположение модулей
Компилятор находит файлы модулей, преобразовывая имена пакетов и модулей непосредственно в имена каталогов и файлов.
Например, два модуля «сотрудник» и «офис» будут расположены как «компания / сотрудник.d» и «животное / офис.d» соответственно (или «компания \ сотрудник.d» и «компания \ офис.d», в зависимости от файловая система) для company.employee и company.office.
Длинные и короткие имена модулей
Имена, которые используются в программе, могут быть дополнены именами модулей и пакетов, как показано ниже.
import company.employee;
auto employee0 = Employee();
auto employee1 = company.employee.Employee();
Длинные имена обычно не нужны, но иногда возникают конфликты имен. Например, при обращении к имени, которое появляется более чем в одном модуле, компилятор не может решить, какое из них имеется в виду. Следующая программа составляет длинные имена, чтобы различать две отдельные структуры сотрудников , которые определены в двух отдельных модулях: компания и колледж. .
Первый модуль сотрудников в папке Company выглядит следующим образом.
module company.employee;
import std.stdio;
class Employee {
public:
string str;
void print() {
writeln("Company Employee: ",str);
}
}
Второй модуль сотрудников в папке College выглядит следующим образом.
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