#d
#d
Вопрос:
Я пытаюсь воспроизвести шаблон типа пространства имен в D. Я хотел бы иметь один класс для каждого файла и иметь возможность использовать один import
оператор для включения всех классов из группы файлов.
в моей корневой папке у меня есть moduleExp.d
import foo.module;
import std.stdio;
void main()
{
writeln("hello world");
auto quakk = new Quakk();
quakk.write();
}
В моей папке foo у меня есть module1.d:
module foo.module1;
import std.stdio;
class Quakk
{
public string name = "thename";
public void write()
{
writeln(this.name);
}
}
Также в папке foo у меня есть модуль.d, который, как я думал, я мог бы использовать для публичного импорта всех моих модулей класса, чтобы их можно было использовать в moduleExp.d корневой папки.
module foo.module;
public import foo.module1;
Когда я пытаюсь выполнить компиляцию в Windows из корневой папки с rdmd moduleExp
помощью, я получаю ошибки:
moduleExp.d(1): Error: identifier expected following package
moduleExp.d(1): Error: ';' expected
Failed: ["dmd", "-v", "-o-", "moduleExp.d", "-I."]
Я не уверен, что я здесь делаю не так. если я изменю строку 1 в module.Exp.d на import foo.module1;
, тогда все будет работать.
Ответ №1:
module
это зарезервированное ключевое слово, которое вы не должны использовать в качестве имени модуля. И то, что вы пытаетесь сделать, существует как функция в dlang, вызываемая package modules
. Посмотрите в http://dlang.org/module.html для документации.
Итак, по сути, у вас есть модуль в папке foo
, его имя должно быть package.d
, где вы публично импортируете модули в foo и любые другие модули, которые вы хотите. Пример:
module foo; // notice the module name is used
// for the package module and not foo.package
public import foo.module1;
public import foo.module2;
...
И теперь, когда вы хотите импортировать пакет, просто напишите import foo
.