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.
- 1. Jaka jest różnica między "typedef" i "using" w C++ 11?
- 2. Różnica między typedef i C++ 11 typu alias
- 3. różnica między typedef i zdefiniować
- 4. Jaka jest różnica między DOMContentLoaded i DOMContentReady?
- 5. Jaka jest różnica między? : i ||
- 6. Jaka jest różnica między $ i $$?
- 7. Jaka jest różnica między "mutex" i "lock"?
- 8. Jaka jest różnica między `typedef struct X {}` a `typedef struct {} X`?
- 9. Jaka jest różnica między Subtotal i BaseSubtotal?
- 10. Jaka jest różnica między DetachedCriteria i ICriteria
- 11. Jaka jest różnica między & # x00A0; i ?
- 12. Jaka jest różnica między lex i yacc
- 13. jaka jest różnica między dijit i dojo
- 14. Jaka jest różnica między Control.Select() i Control.Focus()?
- 15. Jaka jest różnica między System.Windows.Controls.Control i System.Windows.Forms.Control?
- 16. Jaka jest różnica między apletami i SWING?
- 17. Jaka jest różnica między session.commit() i session.flush()?
- 18. Jaka jest różnica między ImageView.setBackgroundResource i ImageView.setImageResource?
- 19. Jaka jest różnica między Konwertuj i parsuj?
- 20. Jaka jest różnica między JSP i JSTL?
- 21. Jaka jest różnica między Lazarus i CodeTyphon
- 22. Jaka jest różnica między crc32 i crc32b?
- 23. Jaka jest różnica między TypedArray.getInteger() i TypedArray.getInt()?
- 24. jaka jest różnica między ARM7 i ARM7s
- 25. Jaka jest różnica między http_build_str() i http_build_query()?
- 26. Jaka jest różnica między "CompletionStage" i "CompletableFuture"?
- 27. Jaka jest różnica między mock.patch.object (... i mock.patch (
- 28. Jaka jest różnica między GetBlobReference i GetBlobReferenceFromServer?
- 29. Jaka jest różnica między NSLayoutAttributeBaseline i NSLayoutAttributeBottom?
- 30. Jaka jest różnica między handlebar.js i handlebar.runtime.js?
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