2011-12-25 9 views
13

Per tutto questo tempo ho utilizzato alias, ma oggi ho scoperto per caso che D ha typedef. Abbastanza interessante, TDPL non lo copre nemmeno per quanto posso dire (nemmeno elencato in D Keywords né Errata). Il site does cover it, ma non ne parla molto. Il mio codice viene compilato con entrambi, ma qual è la differenza tra i due e quando dovrei usare typedef su alias?Qual è la differenza tra `alias` e` typedef`?

risposta

19

alias crea un nuovo nome per uno esistente. typedef funziona solo su tipi, e in realtà crea un nuovo tipo:

alias int A; 
typedef int B; 

pragma(msg, is(A == int)); // true 
pragma(msg, is(B == int)); // false 

Con typedef, è anche possibile modificare l'inizializzazione di default:

typedef int A = 42; 

A a; 
A[5] b; 

void main() 
{ 
    assert(a == 42); 
    foreach(i; b) assert(i == 42); 
} 

alias è più generale. Funziona anche con i simboli:

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 viene utilizzato anche quando si desidera unire set di sovraccarico:

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 
} 

Senza l'unione esplicito, chiamando Base.foo utilizzando un'istanza di Derived non è consentito, perché Derived.foo lo nasconde di default

Questo non è richiesto solo per le classi; se le funzioni di due diversi moduli importati si sovraccaricano a vicenda, devono essere unite esplicitamente con alias.

typedef obsoleto. A partire da DMD versione 2.057, l'utilizzo di typedef richiede la compilazione del flag -d (per "deprecato").

This pull request aggiunge un modello TypeDef per std.typecons replicare la funzionalità del typedef nella libreria standard.

7

La parola chiave 'typedef' è un residuo di D1 ed è sempre stata pensata per essere deprecata. A partire da D 2.057, era completamente deprecato. Si dovrebbe sempre usare l'alias quando si lavora con D2.

+0

Perché è stato deprecato? L'alias – Mehrdad

+0

è una funzione di aliasing generalizzata; puoi usarlo per alias campi, funzioni, variabili, tipi e così via. È stato deciso che questo era un design migliore rispetto al typedef che funziona solo per i tipi. Inoltre, typedef è in realtà una scelta di parole povere per ciò che fa. –

+0

@Zor: Strano ... sembrava piuttosto intuitivo ('definisci' un nuovo 'tipo' basato su uno esistente) ed è stato davvero estremamente utile nella definizione di HANDLE e molte altre cose ... – Mehrdad

Problemi correlati