2015-09-30 10 views

Odpowiedz

14

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!

2

... 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.

Powiązane problemy