2011-12-25 26 views
13

Todo este tiempo he estado usando alias, pero hoy descubrí por casualidad que D tiene typedef. Es bastante interesante que TDPL ni siquiera lo cubra por lo que yo sé (ni siquiera aparece en D Keywords ni en la errata). El site does cover it, pero no habla mucho de eso. Mi código compila con cualquiera, pero ¿cuál es la diferencia entre los dos y cuándo debo usar typedef sobre alias?¿Cuál es la diferencia entre `alias` y` typedef`?

Respuesta

19

alias crea un nuevo nombre para uno existente. typedef sólo funciona en los tipos, y de hecho crea un nuevo tipo:

alias int A; 
typedef int B; 

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

Con typedef, también puede cambiar la inicialización por defecto:

typedef int A = 42; 

A a; 
A[5] b; 

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

alias es más general. También trabaja con símbolos:

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 también se utiliza cuando se desea combinar conjuntos de sobrecarga:

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 
} 

Sin la combinación explícita, llamando Base.foo usando no se permite una instancia de Derived, porque Derived.foo lo oculta por defecto.

Esto no solo se requiere para las clases; si las funciones de dos módulos importados diferentes se sobrecargan entre sí, deben fusionarse explícitamente con alias.

typedef está obsoleto. A partir de la versión 2.057 de DMD, el uso de typedef requiere la compilación del indicador -d (para "desaprobado").

This pull request añade una plantilla TypeDef a std.typecons replicar la funcionalidad de typedef en la biblioteca estándar.

7

La palabra clave 'typedef' es un remanente de D1, y siempre se pensó que estaba en desuso. A partir de D 2.057, estaba completamente obsoleto. Siempre debe usar un alias cuando trabaje con D2.

+0

¿Por qué se desaprobó? – Mehrdad

+0

alias es una característica de aliasing generalizada; puede usarlo para aliar campos, funciones, variables, tipos, etc. Se decidió que este era un mejor diseño que tener typedef, que solo funciona para los tipos. Además, typedef es realmente una elección muy pobre de palabra clave para lo que hace. –

+0

@Zor: Extraño ... parecía bastante intuitivo ('definir' un nuevo 'tipo' basado en uno existente) y en realidad fue extremadamente útil para definir HANDLEs y muchas otras cosas ... – Mehrdad

Cuestiones relacionadas