Verwendet @enum
die einzige Möglichkeit, Julia Enum-Datentyp zu deklarieren? Wenn ja warum?Verschiedene Möglichkeiten, Enum-Datentyp in Julia-Lang zu deklarieren
Antwort
Es ist der einzige (einfache) Weg, ja. Die Antwort, wie oft (oder besser immer) in Julia, kann durch den Blick auf die source code gefunden werden. Das kann anfangs ein bisschen gruselig sein, aber man gewöhnt sich nach einiger Zeit daran!
Um ein Objekt eines bestimmten Typs zu erstellen, rufen Sie normalerweise den Konstruktor des Typs auf. So könnte man erwarten, dass ein Objekt vom Typ Enum
tun
Enum(...)
und erstellen.
In diesem Fall ist Enum
jedoch ein abstrakter Typ, so dass Sie das nicht tun können.
Was bedeutet @enum
tun, dann? Das Beispiel aus dem manual ist
julia> @enum FRUIT apple=1 orange=2 kiwi=3
Das tatsächlich schafft eine völlig neue Art, genannt FRUIT
, ist, dass ein Subtyp von Enum
und Objekte dieses Typs apple
genannt, orange
und kiwi
, die denen umgewandelt werden Zahlen durch den Aufruf Int(apple)
usw. Dies wird durch die Generierung der Julia-Code, um dies zu tun, innerhalb des Makros getan.
Im Prinzip könnte man, sich selbst, die ganze Arbeit, die das Makro tut, aber das Makro ist es unser Leben leichter zu machen!
... und dann gibt es den missbrauchenden Weg, es zu tun; dass ich gestolpert, während die Typen als Name für Sätze zu denken:
typealias Sunday Val{:Sunday}
typealias Monday Val{:Monday}
typealias Tuesday Val{:Tuesday}
typealias Wednesday Val{:Wednesday}
typealias Thursday Val{:Thursday}
typealias Friday Val{:Friday}
typealias Saturday Val{:Saturday}
typealias Days Union{
Type{Sunday},
Type{Monday},
Type{Tuesday},
Type{Wednesday},
Type{Thursday},
Type{Friday},
Type{Saturday}
}
function daynumber(d::Days)
if d == Sunday return 0
elseif d == Monday return 1
elseif d == Tuesday return 2
elseif d == Wednesday return 3
elseif d == Thursday return 4
elseif d == Friday return 5
elseif d == Wednesday return 6
end
-1
end
> daynumber(Friday)
5
> daynumber(:Friday)
> MethodError:`daynumber` has no method matching (::Symbol)
Beachten Sie, dass die Verwendung von Symbolen nur ein ziemlich wenig Reflexion ist, und ist völlig überflüssig. Sie können alles in dort setzen, und es dann durch
Typ Inspektion erholen> x = Saturday.parameters[1]
:Saturday
> typeof(x)
Symbol
> eval(x) == Saturday
true
ich ziemlich sicher bin der Dokumentation empfiehlt ausdrücklich against diese. Dennoch büßt @code_warntype dieses Konstrukt nicht besonders ein.
In satztheoretischen Begriffen ist jeder Tag-Alias ein Singletontyp und somit ein Name für eine Menge von genau einem Element. Die "Union" von "Typ" s ist dann die mengentheoretische Vereinigung einzelner Elementmengen, die den enumerierten endlichen Settyp bilden.
... und noch mehr Art Mangeln Weisen
Aufzählung tunabstract Fruits{N} <: Enum
immutable Apples <: Fruits{1} end
immutable Oranges <: Fruits{2} end
immutable Bananas <: Fruits{3} end
fruitsalad{N}(x::Fruits{N}) = N
> anorange = Oranges()
> fruitsalad(anorange)
2
Wieder scheint @code_warntype nicht dies überhaupt in den Sinn. Schließlich noch eine letzte Technik, die auch einen geschützten Namensraum für die Zählung liefert
immutable Fruits{N} <: Enum
apples::Fruits
bananas::Fruits
oranges::Fruits
function Base.call(::Type{Fruits})
new{"anything"}(
Fruits{"crunchy"}(),
Fruits{"mushy"}(),
Fruits{"tangy"}()
)
end
function Base.call{N}(::Type{Fruits{N}})
if N != "crunchy" && N != "mushy" && N != "tangy"
error("Invalid enumeration parameter")
end
new{N}()
end
end
fruitsalad{N}(x::Fruits{N}) = N
> fruitsalad(Fruits().apples)
"crunchy"
In diesem letzten Beispiel die Bequemlichkeit Eigenschaft zuzugreifen, die eine Instanz einer bestimmten Frucht gibt mussten wir zunächst den allgemeinen Früchte Typen instanziiert. Im Jargon des objektorientierten Designs hat Julia keinen Sinn für statische Eigenschaften von Typen.Die Eigenschaften von Typen sind nur verfügbar, wenn eine explizite Instanz dieses Typs erstellt wurde. Der Gedanke, dass alles, was über einen bestimmten Typ statisch verfügbar ist, sollte in einer Form der Methodenüberladung dargestellt werden.
- 1. Verschiedene Möglichkeiten, Strings zu vergleichen
- 2. Verschiedene Möglichkeiten zu definieren Modelle in Sequelize
- 3. Verschiedene Möglichkeiten DAGs in Java zu implementieren
- 4. Verschiedene Möglichkeiten, Servlet-Kontext
- 5. verschiedene Möglichkeiten über window.location.href.replace
- 6. Verschiedene Möglichkeiten, um Kernel
- 7. Verschiedene Möglichkeiten Winkel js
- 8. Verschiedene Möglichkeiten, eine Sammlung zu nummerieren
- 9. Verschiedene Möglichkeiten von
- 10. Zwei verschiedene Möglichkeiten, einen Konstruktor zu definieren
- 11. Wie viele Möglichkeiten gibt es Variablen in Facelets zu deklarieren?
- 12. Verschiedene Möglichkeiten, Outlook AddIns zu erstellen
- 13. Verschiedene Möglichkeiten, eine String-Ressource zu erhalten
- 14. Zwei verschiedene Möglichkeiten, Javascript zu machen Objekte
- 15. verschiedene Möglichkeiten zugehörige Tabellen zuzugreifen
- 16. Reflexion: verschiedene Möglichkeiten Eigenschaftswert abzurufen
- 17. Arity Einschränkung für Julialang Funktionstyp
- 18. Verschiedene Möglichkeiten zum Erstellen von HashMaps
- 19. Verschiedene Möglichkeiten zum Hinzufügen zum Wörterbuch
- 20. Verschiedene Möglichkeiten zum Debuggen einer web2py-Anwendung
- 21. Zwei verschiedene Möglichkeiten, das Formular zu bearbeiten Ereignis schließen
- 22. Benötigen Sie verschiedene Möglichkeiten, um mit dieser Ausgabe zu kommen
- 23. Verschiedene Möglichkeiten zum Parsen von XML
- 24. Verschiedene Möglichkeiten der Verwendung von SelectMany()
- 25. Django mit Gunicorn verschiedene Möglichkeiten zur Bereitstellung
- 26. Verschiedene Möglichkeiten der Einstellung DB-Verbindungseigenschaften
- 27. TextView verschiedene Möglichkeiten zum Hinzufügen von Zeichen
- 28. Java verschiedene Möglichkeiten zur Schaffung von Objekten
- 29. Verschiedene Arten, Variablen in Funktionen zu deklarieren - wie unterscheiden sie sich?
- 30. Verschiedene Möglichkeiten zum Übergeben von Variablen in MSBuild
In welcher Sprache? In * Julia *? Lesen Sie die Dokumentation ... – m02ph3u5