Как использовать общедоступный импорт в D

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