Как использовать полный путь к пространству имен для функции в D - PullRequest
5 голосов
/ 18 октября 2008

Я хочу использовать такую ​​функцию, как writefln(), но без добавления import std.stdio вверху файла.

Еще один способ объяснить это - то, как вы делаете это в C ++. Вы можете набрать std::cout << "Test";, и вам не придется добавлять using namespace std;. Я хочу сделать то же самое, но в D.

Ответы [ 5 ]

8 голосов
/ 27 февраля 2009

Я знаю, что это старый вопрос, но я не вижу правильного ответа, поэтому я все равно отвечаю.

Статический импорт

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

static import std.stdio;

void main()
{
    writefln("hello!");            // error, writefln is undefined
    std.stdio.writefln("hello!");  // ok, writefln is fully qualified
}

Источник

6 голосов
/ 12 ноября 2008

Как указано выше, D-модули - это гораздо больше, чем пространства имен C ++. D также является модульным языком. Модули в D имеют конструкторы / деструкторы. Кроме того, у D есть пакеты. Подробнее о модулях и пакетах в D читайте здесь: http://www.digitalmars.com/d/2.0/module.html.

Вот самая интересная часть того, что говорит эта страница:

Модули имеют один-к-одному переписка с исходными файлами. Имя модуля - это имя файла с путь и расширение удалены.

Модули автоматически предоставляют область имен для их содержимого. Модули внешне напоминают классы, но отличаются тем, что:

  • Существует только один экземпляр каждого модуля, и он статически выделяется.
  • Нет виртуальной таблицы.
  • Модули не наследуются, у них нет супер-модулей и т. Д.
  • Только один модуль на файл.
  • Символы модуля могут быть импортированы.
  • Модули всегда компилируются в глобальном масштабе и не зависят от окружающие атрибуты или другие модификаторы.

Модули могут быть сгруппированы в иерархии, называемые пакетами.

Модули предлагают несколько гарантий: - Порядок, в котором импортируются модули, не влияет на семантика. - Семантика модуля не зависит от того, что импортирует его. - Если модуль C импортирует модули A и B, любые изменения в B не будут молча изменить код в C, который зависит от А.

5 голосов
/ 19 октября 2008

Вы должны использовать часть импорта. Однако можно обратиться к методу / функции / как угодно с полным путем к модулю перед ним. Например, std.stdio.writefln ("...") будет действительным, если вы импортируете std.stdio (и используете Phobos). Это может быть полезно, если у вас есть более одной функции, которая называется writefln.

2 голосов
/ 18 октября 2008

Я не думаю, что вы можете сделать это. Оператор import в D делает больше, чем оператор using namespace в C ++. Он также заменяет директиву препроцессора #include.

0 голосов
/ 20 августа 2010

Вы можете импортировать отдельные функции / классы (не уверены в синтаксисе):

import std.stdio: writef, writefln;
...