2015-09-30 24 views

答えて

14

これは唯一の(簡単な)方法です。ジュリアの答えは、よくあるのですが(あるいはむしろ常に)、source codeを見てください。 これは最初はちょっと怖いかもしれませんが、しばらくすると慣れてきます!

通常、指定された型のオブジェクトを作成するには、型のコンストラクタを呼び出します。 だから、

Enum(...) 

を行うと、タイプEnumのオブジェクトを作成できるように期待するかもしれません。

ただし、Enumは、抽象タイプです。このようにすることはできません。

@enumは何ですか? manualの例は

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

これは実際は、全く新しいタイプを作成することがEnumのサブタイプである、FRUITと呼ばれ、それらに変換されるappleorangekiwiと呼ばれる、その型のオブジェクト数字はInt(apple)などと呼んでいます。これは、マクロ内でそうするためにジュリアコードを生成することによって行われます。

原則として、あなた自身が、マクロが行うすべての作業を行うことができますが、マクロは私たちの生活を楽にします!

2

...そして、それを行う悪用方法があります。シンボルの使用は、単に反射のかなりのビットで、かつ完全に不必要であることを

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) 

注:セットの名前と種類のことを考えながら、私がつまずいていること。あなたはそこに何かを入れ、その後、私はドキュメントが明示的にagainstこのことをお勧めしますかなり確信しているタイプの検査

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

を通してそれを回復することができます。それにもかかわらず、@ code_warntypeは特にこの構造では嫌がらせをしません。

理論的に言えば、毎日のエイリアスはシングルトンタイプなので、ちょうど1つの要素のセットの名前です。 "Type"の "Union"は、単一要素集合の集合理論集合であり、列挙有限集合型を形成する。

...と再び@code_warntypeがすべてで、これを気にしていないようだ列挙

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 

を行う方法をマングリングがさらにタイプ。また、我々は最初の一般的な果物の種類をインスタンス化しなければならなかった、特定の果物のインスタンスを与える便利なプロパティにアクセスするには、この最後の例では、列挙

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" 

のための保護された名前空間を提供して最終的に最後の技法。オブジェクト指向設計の言い回しの中で、Juliaは型の静的な属性の感覚を持っていません。型のプロパティは、その型の明示的なインスタンスが構築された後にのみ利用可能です。特定の型について静的に利用できるものは、何らかの形のメソッドオーバーロードで表現されるべきであるという考えがあります。

関連する問題