@enum
を使用してJulia Enumデータ型を宣言する唯一の方法はありますか?もしそうなら、なぜですか?Julia-LangでEnumデータ型を宣言する異なる方法
答えて
これは唯一の(簡単な)方法です。ジュリアの答えは、よくあるのですが(あるいはむしろ常に)、source codeを見てください。 これは最初はちょっと怖いかもしれませんが、しばらくすると慣れてきます!
通常、指定された型のオブジェクトを作成するには、型のコンストラクタを呼び出します。 だから、
Enum(...)
を行うと、タイプEnum
のオブジェクトを作成できるように期待するかもしれません。
ただし、Enum
は、抽象タイプです。このようにすることはできません。
@enum
は何ですか? manualの例は
julia> @enum FRUIT apple=1 orange=2 kiwi=3
これは実際は、全く新しいタイプを作成することがEnum
のサブタイプである、FRUIT
と呼ばれ、それらに変換されるapple
、orange
とkiwi
と呼ばれる、その型のオブジェクト数字はInt(apple)
などと呼んでいます。これは、マクロ内でそうするためにジュリアコードを生成することによって行われます。
原則として、あなた自身が、マクロが行うすべての作業を行うことができますが、マクロは私たちの生活を楽にします!
...そして、それを行う悪用方法があります。シンボルの使用は、単に反射のかなりのビットで、かつ完全に不必要であることを
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は型の静的な属性の感覚を持っていません。型のプロパティは、その型の明示的なインスタンスが構築された後にのみ利用可能です。特定の型について静的に利用できるものは、何らかの形のメソッドオーバーロードで表現されるべきであるという考えがあります。
- 1. レールジェネレータで配列データ型を宣言する方法
- 2. 異なるEnum型のクラスを直列化するEnum型
- 3. C++で異なるデータ型を持つクラステンプレートポインタへのポインタを宣言する方法
- 4. 異なるモジュールでグローバルにパイプを宣言する方法は?
- 5. ジェネリック型の宣言方法
- 6. 異なるデータ型を使用してmatlabに永続変数を宣言する方法
- 7. EclipseのEnum宣言
- 8. enum型で他の変数やメソッドの宣言よりも前にenum定数を宣言する必要があるのはなぜですか?
- 9. enumを宣言するルータAlamofire swift 3.0
- 10. Pythonで複雑なデータ構造の型を宣言する
- 11. 変数宣言とデータ型
- 12. 新しい複雑な変数型を宣言する方法
- 13. map.size()で計算されるint型を宣言する方法
- 14. dozerでデータ型を異なるデータ型にマップする方法は?
- 15. Objective-Cの前方宣言enum
- 16. テンプレートパラメータ内の前方宣言クラスenum?
- 17. C++のTypedef enum宣言
- 18. 周囲のEnum宣言エラー
- 19. ジェネリッククラス内でセットタイプの列挙型を宣言する方法
- 20. 変数型を文字列で宣言する方法
- 21. 宣言型サービスを参照していない宣言型サービス
- 22. Mercury:高次データ型の決定論を宣言する方法は?
- 23. 汎用宣言型の認識方法
- 24. * any * enumのアノテーション属性を宣言する方法はありますか?
- 25. F# - 宣言で型を指定する
- 26. TypeScriptでインラインオブジェクトの型を宣言する
- 27. 列挙型プロパティの既定値を宣言する方法は?
- 28. Jenkins宣言型パイプライン:プロパティを挿入する方法
- 29. Typescript:globals.d.tsの型エイリアスを正しく宣言する方法
- 30. 多型関数のフロータイプライブラリ定義を宣言する方法
どの言語ですか? * Julia *で?ドキュメントを読む... – m02ph3u5