124

私は Scala 列挙型クラスを理解していないと言わざるを得ません。ドキュメントから例をコピーして貼り付けることができますが、何が起こっているのかわかりません。

object WeekDay extends Enumeration {
  type WeekDay = Value
  val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
import WeekDay._
  • どういう意味type WeekDay = Valueで、なぜそれを書かなければならないのですか?
  • なぜval Mon = Valueですか?それは一体何の意味ですか?
  • WeekDay オブジェクトをインポートする必要があるのはなぜですか? と、
  • 私が書くときval day = WeekDay.Mon、なぜそれは typeWeekDay.Valueではなく type なのWeekDayですか?
4

1 に答える 1

152

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メソッドbcfoo度も呼び出されます。Enumerationこのトリックを使用して内部カウンターをインクリメントし、各値が個別になるようにします。

のScalaAPIドキュメントを開いてEnumerationをクリックするとVisibility: All、そのメソッドが表示されます。

于 2012-06-16T22:21:23.757 に答える