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
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.
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.
- 1. Qual è la differenza tra xtype e alias?
- 2. Qual è la differenza tra il metodo alias e il simbolo alias?
- 3. Qual è la differenza tra "typedef" e "using" in C++ 11?
- 4. Qual è la differenza tra = e: =
- 5. Qual è la differenza tra Verilog! e ~?
- 6. Qual è la differenza tra? : e ||
- 7. qual è la differenza tra [[], []] e [[]] * 2
- 8. Qual è la differenza tra $ e $$?
- 9. Qual è la differenza tra ("") e (null)
- 10. Qual è la differenza tra dict() e {}?
- 11. Qual è la differenza tra " " e ""?
- 12. Qual è la differenza tra {0} e ""?
- 13. Qual è la differenza tra `##` e `hashCode`?
- 14. Qual è la differenza tra {0} e +?
- 15. Qual è la differenza tra .ToString() e + ""
- 16. qual è la differenza tra:.! e: r !?
- 17. Qual è la differenza tra TCHAR e WCHAR?
- 18. Qual è la differenza tra rails in_groups e in_groups_of?
- 19. Qual è la differenza tra DOMContentLoaded e DOMContentReady?
- 20. Qual è la differenza tra intXX_t e int_fastXX_t?
- 21. Qual è la differenza tra Ember.computed.alias e Ember.binding?
- 22. Qual è la differenza tra loop.create_task, asyncio.async/ensure_future e Task?
- 23. qual è la differenza tra il modello-> alias e modello-> nome in CakePHP?
- 24. Differenza tra Elm e tipo alias?
- 25. Qual è la differenza tra "è Nessuno" e "== Nessuno"
- 26. Unix: Qual è la differenza tra la fonte e l'esportazione?
- 27. Qual è la differenza tra il callback e la promessa
- 28. Qual è la differenza tra la sezione .got e .got.plt?
- 29. Qual è la differenza tra la lista() e []
- 30. Qual è la differenza tra GHC e la piattaforma Haskell?
Perché è stato deprecato? L'alias – Mehrdad
è 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. –
@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