2015-09-30 18 views

cevap

14

Tek (kolay) yol, evet. Cevap Julia, sık sık (ya da daha doğrusu, her zaman), source code bakarak bulunabilir. İlk başta biraz korkutucu olabilir, ama bir süre sonra buna alışırsınız!

Normalde, belirli bir türde bir nesne oluşturmak için, yazıcının yapıcısını çağırırsınız. Yani

Enum(...) 

yapmak ve türüne Enum bir nesne oluşturmak mümkün olması beklenebilir.

Bu durumda, Enum, türünde türünde olduğundan, bunu yapamazsınız.

@enum ne yapar? manual örnek Bu aslında tamamen yeni bir tür yaratır

julia> @enum FRUIT apple=1 orange=2 kiwi=3 

, FRUIT denilen, yani Enum bir alt tipi olan ve bu dönüştürülür, appleorange ve kiwi denen tipte nesneler Int(apple) numaralı telefonu arayarak numaralar. Bu, bunu yapmak için Julia kodunun oluşturulmasıyla yapılır.

Prensip olarak, makronun yaptığı tüm işleri yapabilirdiniz, ancak makro hayatımızı kolaylaştırmak için var!

2

... ve daha sonra bunu yapmanın kötüye kullanımı vardır; Sembollerin kullanımı sadece yansıma güzel bit ve tamamen gereksiz olduğunu

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) 

Not: setleri için adları gibi türleri düşünürken ben tökezledi. Orada bir şey koymak, sonra belgeler açıkça against bu önerir eminim tipi muayene

> x = Saturday.parameters[1] 
    :Saturday 
> typeof(x) 
    Symbol 
> eval(x) == Saturday 
    true 

aracılığıyla kurtarabilirsiniz. Yine de @code_warntype bu yapıya özellikle uymuyor.

Belirlenen kuramsal terimlerle, her gün diğer adı bir tek tiptir ve dolayısıyla tam olarak bir öğe kümesi için bir addır. "Tip" in "Birlik" i, daha sonra sayılan sonlu küme türünü oluşturan tek eleman kümelerinin ayarlanmış teorik birliğidir.

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 

numaralandırma

yapmanın

... ve henüz daha tip bozma yolu Yine @code_warntype tüm bu akla görünmüyor. Nihayet bu son örnekte numaralandırma

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" 

için korumalı bir ad sağlar son bir tekniktir öncelikle genel meyveler türü örneğini zorunda belirli meyve örneğini verir kolaylık özelliğine erişmek için. Nesne yönelimli tasarımın ifadesinde Julia, türlerin statik özelliklerine sahip değildir.Türlerin özellikleri, yalnızca bu türün açık bir örneği oluşturulduktan sonra kullanılabilir. Düşünce, belirli bir tipte statik olarak mevcut olan herhangi bir şeyin, bir yöntem aşırı yüklenmesinde temsil edilmesi gerektiğidir.

İlgili konular