Псевдоним, как об этом говорит его название, является альтернативным именем для существующих имён. Синтаксис для псевдонима показан ниже.
alias новое_имя = существующее_имя;
Ниже приведен устаревший синтаксис, на всякий случай, если вы будете изучать какие-либо примеры в устаревшем формате. Настоятельно рекомендуется не использовать его.
alias существующее_имя новое_имя;
Существует также другой синтаксис, который используется с выражением, он приведён ниже, в нём мы можем напрямую использовать имя псевдонима вместо выражения.
alias выражение имя_псевдонима;
Как вы, возможно, знаете, typedef даёт возможность создавать новые типы. Псевдоним может выполнять работу typedef и даже больше. Ниже приведен простой пример использования псевдонима, который использует шаблон to из модуля std.conv, предоставляющий возможность преобразования типов.
import std.stdio; import std.conv:to; alias to!(string) toString; void main() { int a = 10; string s = "Проверка "~toString(a); writeln(s); }
Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:
Проверка 10
В приведенном выше примере вместо использования выражения to!string(a), мы назначили его псевдониму toString, что сделало его более удобным и понятным.
Давайте посмотрим на другой пример, где мы можем установить имя псевдонима для кортежа типов.
import std.stdio; import std.typetuple; alias TL = TypeTuple!(int, long); void method1(TL tl) { writeln(tl[0],"\t", tl[1] ); } void main() { method1(5, 6L); }
Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:
5 6
В приведённом выше примере кортеж типов присваивается переменной псевдонима и упрощает определение метода и доступ к переменным. Такой вид доступ ещё более полезен, если нам понадобится повторно использовать такие кортежи типов.
Существует множество случаев, когда нам нужно переопределить обычные типы данных, которые необходимо использовать в приложении. Когда несколько программистов пишут приложение, может случиться так, что один человек использует int, другой double и т.д. Чтобы избежать таких конфликтов, мы часто используем собственные типы для типов данных. Ниже приведен простой пример.
import std.stdio; alias myAppNumber = int; alias myAppString = string; void main() { myAppNumber i = 10; myAppString s = "ТестоваяСтрока"; writeln(i,s); }
Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:
10ТестоваяСтрока
Часто возникает потребность, когда нам нужно получить доступ к переменным-членам суперкласса в подклассе, это может быть сделано с помощью псевдонима, возможно, под другим именем.
Если вы не знакомы с концепцией классов и наследования, перед изучением этого раздела ознакомьтесь с руководством по классам и наследованию.
Ниже приведен простой пример.
import std.stdio; class Shape { int area; } class Square : Shape { string name() const @property { return "Square"; } alias squareArea = Shape.area; } void main() { auto square = new Square; square.squareArea = 42; writeln(square.name); writeln(square.squareArea); }
Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:
Square 42
Псевдоним предоставляет возможность автоматического преобразования пользовательских типов. Синтаксис показан ниже, где ключевые слова alias и this записываются по обе стороны от переменной-члена или функции-члена.
alias переменная_член_или_метод this;
Ниже приведен пример, показывающий силу alias this.
import std.stdio; struct Rectangle { long length; long breadth; double value() const @property { return cast(double) length * breadth; } alias value this; } double volume(double rectangle, double height) { return rectangle * height; } void main() { auto rectangle = Rectangle(2, 3); writeln(volume(rectangle, 5)); }
В приведенном выше примере вы можете видеть, что структура rectangle преобразуется в значение типа double с помощью псевдонима this на метод.
Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:
30