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
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.
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.
- 1. ¿Cuál es la diferencia entre xtype y alias?
- 2. ¿Cuál es la diferencia entre 'typedef' y 'using' en C++ 11?
- 3. ¿Cuál es la diferencia entre boost :: multi_array vistas y subarrays
- 4. ¿Cuál es la diferencia entre uint y System.UInt32?
- 5. ¿Cuál es la diferencia entre " " y ""?
- 6. ¿cuál es la diferencia entre:.! y: r !?
- 7. ¿Cuál es la diferencia entre ".equals" y "=="?
- 8. Cuál es la diferencia entre = y: =
- 9. ¿Cuál es la diferencia entre [indefinido] y [,]?
- 10. ¿Cuál es la diferencia entre .ToString (+) y ""
- 11. Cuál es la diferencia entre $ (...) y `...`
- 12. ¿Cuál es la diferencia entre `##` y `hashCode`?
- 13. ¿Cuál es la diferencia entre + = y = +?
- 14. ¿Cuál es la diferencia entre dict() y {}?
- 15. Cuál es la diferencia entre $ y jQuery
- 16. ¿Cuál es la diferencia entre "$^N" y "$ +"?
- 17. ¿Cuál es la diferencia entre {0} y ""?
- 18. ¿Cuál es la diferencia entre TCHAR y WCHAR?
- 19. ¿Cuál es la diferencia entre DOMContentLoaded y DOMContentReady?
- 20. ¿cuál es la diferencia entre model-> alias y model-> name en CakePHP?
- 21. ¿Cuál es la diferencia entre "mutex" y "lock"?
- 22. OpenGL (ES) - ¿Cuál es la diferencia entre frustum y orto?
- 23. ¿Cuál es la diferencia entre la abstracción y la encapsulación?
- 24. Cuál es la diferencia entre la función() {}() y la función() {}()
- 25. ¿Cuál es la diferencia entre @ y $ y% en MSBuild?
- 26. Python: ¿Cuál es la diferencia entre __builtin__ y __builtins__?
- 27. ¿Cuál es la diferencia entre la vinculación estática y dinámica?
- 28. ¿Cuál es la diferencia entre la carpeta vim72 y vimfiles?
- 29. ¿cuál es la diferencia entre el complemento y la biblioteca?
- 30. ¿Cuál es la diferencia entre CookieContainer y la colección Response.Cookies?
¿Por qué se desaprobó? – Mehrdad
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. –
@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