Czy jako jedyny sposób można podać typ danych Julia Enum? Jeśli tak, dlaczego?Różne sposoby deklarowania typu danych Enum w Julia-Lang
Odpowiedz
To jedyny (łatwy) sposób, tak. Odpowiedź, jak często (lub raczej zawsze) w Julii, można znaleźć, patrząc na source code. Na początku może to być trochę przerażające, ale po pewnym czasie przyzwyczaisz się do tego!
Normalnie, aby utworzyć obiekt danego typu, należy wywołać konstruktor typu. więc można oczekiwać, aby być w stanie zrobić
Enum(...)
i utworzyć obiekt typu Enum
.
W tym przypadku jednak Enum
jest typem abstrakcyjnym, więc nie można tego zrobić.
Co robi @enum
? Przykład z manual jest
julia> @enum FRUIT apple=1 orange=2 kiwi=3
To rzeczywiście tworzy całkowicie nowy typ, zwany FRUIT
, że jest podtypem Enum
i obiekty tego typu o nazwie apple
, orange
i kiwi
, które przekształcają się w tych liczb przez wywołanie Int(apple)
itp. Odbywa się to poprzez wygenerowanie kodu Julia, aby to zrobić, wewnątrz makra.
Zasadniczo można wykonać całą pracę wykonywaną przez makro, ale makro ma na celu ułatwić sobie życie!
... a następnie istnieje rodzaj nadużywania tego sposobu; że natknąłem się podczas myślenia typów jako nazwy dla zestawów:
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)
pamiętać, że korzystanie z symboli jest po prostu dość trochę refleksji, i jest całkowicie zbędne. Można umieścić coś tam, a następnie odzyskać go przez typ kontroli
> x = Saturday.parameters[1]
:Saturday
> typeof(x)
Symbol
> eval(x) == Saturday
true
Jestem całkiem pewny dokumentacja wyraźnie zaleca against tego. Niemniej jednak @code_warntype nie jest szczególnie sprzeczne z tą konstrukcją.
W zestawie terminy teoretyczne, każdy alias w ciągu dnia jest typem singleton, a tym samym nazwą zestawu dokładnie jednego elementu. "Zjednoczeniem" "Typów" jest wówczas ustalona teoretyczna unii zbiorów pojedynczych elementów, tworzących wyliczony typ zbioru skończonego.
... i jeszcze więcej sposobów typ maglowania prowadzenia wyliczanie
abstract 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
Ponownie @code_warntype nie przeszkadza to w ogóle. Wreszcie ostatnia technika, która zapewnia również nazw chronionej wyliczenie
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"
W tym ostatnim przykładzie dostępu do właściwości spożywczy, który daje wystąpienie konkretnego owocu mieliśmy do pierwszego wystąpienia ogólny rodzaj owoców. W żargonie projektowania zorientowanego obiektowo Julia nie ma wyczucia właściwości statycznych typów.Właściwości typów są dostępne tylko po skonstruowaniu jawnej instancji tego typu. Uważa się, że wszystko, co jest statycznie dostępne na temat określonego typu, powinno być reprezentowane w jakiejś formie przeciążania metod.
- 1. deklarowania enum w zakresie globalnym
- 2. Różne sposoby tworzenia HashMaps
- 3. różne sposoby kończenia procesu C++
- 4. Różne sposoby używania Użycie W C#
- 5. Różne sposoby wdrożenia DAG w java
- 6. Deklaracja konstruktora klasy ... Dwa sposoby deklarowania tego samego?
- 7. Sposoby zapisywania danych modelu Backbone.js?
- 8. Różne generowanie kodu Enum HashCode?
- 9. Jakie są różne sposoby zastąpienia kursora?
- 10. Różne sposoby określania bibliotek do gcc/g ++
- 11. Ruby Array Sortuj 2 różne sposoby
- 12. Różne sposoby dodawania funkcji do obiektu JavaScript
- 13. Różne sposoby uzyskiwania zasobów ciągów znaków
- 14. dwa różne sposoby, aby javascript obiektów
- 15. Różne sposoby publikowania wartości json na serwerze
- 16. Konwersja Enum w podstawowej typu
- 17. Różne sposoby uzyskiwania aktualnej orientacji interfejsu?
- 18. Typ danych enum w Cassandra
- 19. członkowie enum typu Int32
- 20. Tworzenie typu zmiennej ENUM w MySQL
- 21. Czy SQL Server 2005 ma odpowiednik typu danych ENUM MySql?
- 22. Adnotacja danych modułu encji "Wyświetlana nazwa" typu Enum
- 23. Bind char do typu enum
- 24. Sposoby implementacji wersji danych w MongoDB
- 25. Jakie są różne sposoby obsługi wyliczeń na serwerze SQL?
- 26. Sposoby utrzymywania historii danych w bazie danych SQL Server 2008
- 27. AngularJS - różne sposoby tworzenia kontrolerów i usług, dlaczego?
- 28. C# różne sposoby odlewania - (T) vs obj obj jako T
- 29. Różne sposoby dostępu do wartości atrybutów przy użyciu JavaScript
- 30. deklarowania zmiennych w @implementation
W jakim języku? W * Julia *? Czytaj dokumenty ... – m02ph3u5