Przez cały ten czas używałem alias
, ale dzisiaj odkryłem przypadkiem, że D ma typedef
. Co ciekawe, TDPL nawet go nie pokrywa (o ile nie jest to wymienione w D Keywords
ani Errata). The site does cover it, ale nie mówi o tym zbyt wiele. Mój kod kompiluje się z jedną, ale jaka jest różnica między tymi dwoma i kiedy powinienem używać typedef
przez alias
?Jaka jest różnica między `alias` i` typedef`?
Odpowiedz
alias
tworzy nową nazwę dla istniejącej. typedef
działa tylko na typy, a właściwie tworzy nowy typ:
alias int A;
typedef int B;
pragma(msg, is(A == int)); // true
pragma(msg, is(B == int)); // false
Z typedef
, można również zmienić domyślny inicjator:
typedef int A = 42;
A a;
A[5] b;
void main()
{
assert(a == 42);
foreach(i; b) assert(i == 42);
}
alias
jest bardziej ogólne. Współpracuje także z symbolami:
import std.stdio;
import std.conv : to;
alias to!(string) toString;
void main()
{
int a;
alias a b;
a = 1;
writeln(b); // 1
string s = toString(2);
writeln(s); // 2
}
alias
stosowany jest również, gdy chcemy połączyć zestawy przeciążeniem:
import std.stdio;
class Base
{
void foo() { writeln("base"); }
}
class Derived : Base
{
alias super.foo foo; // merge overload sets
void foo(int i) { writeln("derived"); }
}
void main()
{
auto a = new Derived;
a.foo(); // base
a.foo(0); // derived
}
bez wyraźnej seryjnej, nazywając Base.foo
użyciu instancją Derived
nie jest dozwolone, ponieważ Derived.foo
domyślnie ukrywa.
Jest to wymagane nie tylko w przypadku zajęć; jeśli funkcje z dwóch różnych importowanych modułów mają przeciążać się nawzajem, muszą zostać jednoznacznie scalone z alias
.
typedef
jest przestarzałe. Od wersji 2.057 DMD, użycie typedef
wymaga skompilowania flagi -d
(dla "przestarzałej").
This pull request dodaje szablon TypeDef
do std.typecons
replikacji funkcjonalność typedef
w bibliotece standardowej.
Słowo kluczowe "typedef" jest pozostałością D1 i zawsze miało być przestarzałe. Począwszy od D 2.057, był w pełni przestarzały. Powinieneś zawsze używać aliasu podczas pracy z D2.
Dlaczego był przestarzały? – Mehrdad
alias jest uogólnioną funkcją aliasingu; możesz go użyć do aliasu pól, funkcji, zmiennych, typów i tak dalej. Zdecydowano, że jest to lepszy projekt niż typedef, który działa tylko dla typów. Co więcej, typedef jest w rzeczywistości naprawdę kiepskim wyborem słowa kluczowego w odniesieniu do tego, co robi. –
@Zor: Weird ... wydawało się to dość intuicyjne ("zdefiniuj" nowy "typ" w oparciu o istniejący) i było to bardzo użyteczne przy definiowaniu UCHWYTÓW i wielu innych rzeczy ... – Mehrdad