Programowanie D - aliasy
Alias, zgodnie z nazwą, zapewnia alternatywną nazwę dla istniejących nazw. Składnię aliasów przedstawiono poniżej.
alias new_name = existing_name;
Poniżej znajduje się starsza składnia, na wypadek gdybyś odwołał się do przykładów starszego formatu. Zdecydowanie odradza się korzystanie z tego.
alias existing_name new_name;
Istnieje również inna składnia, która jest używana z wyrażeniem i została podana poniżej, w której możemy bezpośrednio użyć nazwy aliasu zamiast wyrażenia.
alias expression alias_name ;
Jak być może wiesz, typedef dodaje możliwość tworzenia nowych typów. Alias może wykonywać pracę typową, a nawet więcej. Poniżej przedstawiono prosty przykład użycia aliasu, który wykorzystuje nagłówek std.conv, który zapewnia możliwość konwersji typu.
import std.stdio;
import std.conv:to;
alias to!(string) toString;
void main() {
int a = 10;
string s = "Test"~toString(a);
writeln(s);
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
Test10
W powyższym przykładzie zamiast używać to! String (a), przypisaliśmy go do aliasu toString, dzięki czemu jest wygodniejszy i łatwiejszy do zrozumienia.
Alias dla krotki
Spójrzmy na inny przykład, w którym możemy ustawić nazwę aliasu krotki.
import std.stdio;
import std.typetuple;
alias TypeTuple!(int, long) TL;
void method1(TL tl) {
writeln(tl[0],"\t", tl[1] );
}
void main() {
method1(5, 6L);
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
5 6
W powyższym przykładzie krotka typu jest przypisana do zmiennej aliasu i upraszcza definicję metody i dostęp do zmiennych. Ten rodzaj dostępu jest jeszcze bardziej przydatny, gdy próbujemy ponownie użyć krotek tego typu.
Alias dla typów danych
Wiele razy możemy zdefiniować typowe typy danych, które muszą być używane w całej aplikacji. Gdy wielu programistów koduje aplikację, może się zdarzyć, że jedna osoba używa int, inna double i tak dalej. Aby uniknąć takich konfliktów, często używamy typów dla typów danych. Poniżej przedstawiono prosty przykład.
Przykład
import std.stdio;
alias int myAppNumber;
alias string myAppString;
void main() {
myAppNumber i = 10;
myAppString s = "TestString";
writeln(i,s);
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
10TestString
Alias dla zmiennych klas
Często istnieje wymóg, w którym musimy uzyskać dostęp do zmiennych składowych nadklasy w podklasie, można to zrobić za pomocą aliasu, prawdopodobnie pod inną nazwą.
Jeśli nie znasz koncepcji klas i dziedziczenia, zapoznaj się z samouczkiem dotyczącym klas i dziedziczenia, zanim zaczniesz od tej sekcji.
Przykład
Poniżej przedstawiono prosty przykład.
import std.stdio;
class Shape {
int area;
}
class Square : Shape {
string name() const @property {
return "Square";
}
alias Shape.area squareArea;
}
void main() {
auto square = new Square;
square.squareArea = 42;
writeln(square.name);
writeln(square.squareArea);
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
Square
42
Alias This
Alias zapewnia możliwość automatycznej konwersji typów typów zdefiniowanych przez użytkownika. Składnia jest pokazana poniżej, gdzie alias słów kluczowych jest zapisany po obu stronach zmiennej składowej lub funkcji składowej.
alias member_variable_or_member_function this;
Przykład
Przykład jest pokazany poniżej, aby pokazać moc aliasu 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));
}
W powyższym przykładzie widać, że prostokąt struct jest konwertowany na podwójną wartość za pomocą aliasu tej metody.
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
30