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