これまでの承認済みの回答に加えて、enum
の合金に関する1週間の経験から得た有用な洞察、特に標準のsig
の主な違いを追加したいと思います。
abstract sig + extend
を使用する場合は、同じ概念に対応するセットが多数あるモデルを作成します。たぶん、例がそれをより明確にするかもしれない。
sig Car {
dameges: set Damage
}
よう と仮定気にいらあなたは
我々は異なるMinorDamage原子(MinorDamage0、とモデルwiht考え出すことができる最初のケースで
enum Damage {
MajorDamage, MinorDamage
}
対
abstract sig Damage {}
sig MajorDamage, MinorDamage extends Damage {}
を使用するための選択肢を持っていますMinorDamage1、...)はCarsに関連付けられ、後者の場合は、常に異なるCarsが参照できるMinorDamageが1つしかありません。
フォームを使用すると、(この場合、MinorDamageまたはMajorDamageの別の要素を追跡することができるので)意味があります。一方
、あなたはcurrentState: set State
を持つようにしたい場合は、ちょうど3 State
がそれぞれCar
が参照できるためにどのようにするために、コンセプトをマッピングするために
enum State {Damaged, Parked, Driven}
を使用するより良いかもしれません。このように、Visualizer
では、あなたのモデルを正確に1つの状態に投影することができ、この状態に関連付けられているCar
をすべて強調表示します。もちろん、MajorDamage0
に投影すると、そのDamage
に関連付けられたCar
のみが強調表示され、それ以外は表示されないため、abstract + extend
構成ではそのことはできません。
結論として、本当にあなたがしなければならないことに依存しています。
はまた、あなたがXの要素によって構成さ列挙型を持っているとあればY < Xは、合金はまったくのインスタンスを生成しない
run some_predicate for Y
を実行していることに注意してください。 最後の例では、Yを使用できません。
最後に、マジックレイアウトボタンを使用すると、ビジュアライザに列挙型が常に現れるとは限りませんが、前に列挙型にモデルを「投影」し、列挙型のさまざまな要素を切り替えることができます。
ありがとうございます。これは役に立ちます。私は列挙で同じ名前を使用し、別の列挙型の名前がエラーになることになると思います。 (それは簡単にチェックできるので、私が自分で見つけ出すことができるのはなぜ頼んでいるのですか? - はい、合金4.2RCはそれをエラーとしてフラグを立てます)再び –
私は 'private'がhttp ://alloy.mit.edu/alloy/documentation/quickguide/private.html –