Enumerationトレイトには、列挙の個々の要素を表すタイプメンバーがValueあります(実際には内部クラスですが、ここでは違いは重要ではありません)。
したがってobject WeekDay、そのタイプのメンバーを継承します。この行type WeekDay = Valueは単なるタイプエイリアスです。を使用して他の場所にインポートした後、import WeekDay._そのタイプを使用できるため、便利です。例:
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)
代わりに、最小バージョンは次のようになります。
object WeekDay extends Enumeration {
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
の内容をインポートする必要はありませんがobject WeekDay、typeを使用WeekDay.Valueして個々のメンバーを修飾する必要があります。したがって、例は次のようになります
def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun)
2番目の質問はの意味についてval Mon, ... = Valueです。の実装を調べないと、これは確かに非常に混乱しますEnumeration。これはタイプの割り当てではありません!代わりに、同じ名前の保護されたメソッドを呼び出しています。Valueこれは、タイプの具体的なインスタンスを返しますValue。
たまたまScalaで書くことができval a, b, c = foo、値ごとに、、aメソッドbがc何foo度も呼び出されます。Enumerationこのトリックを使用して内部カウンターをインクリメントし、各値が個別になるようにします。
のScalaAPIドキュメントを開いてEnumerationをクリックするとVisibility: All、そのメソッドが表示されます。