Scala列挙を理解する


122

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、なぜそれはタイプWeekDay.ValueではなくタイプなのWeekDayですか?

2
私はscalaの列挙と代替についての小さな概要を書きましたが、あなたはそれが役に立つかもしれません:pedrorijo.com/blog/scala-enums/
pedrorijo91

封印された特性は優れた代替手段を提供します-stackoverflow.com/questions/11203268/what-is-a-sealed-trait
Joey Baruch

回答:


150

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が、その後、あなたはタイプを使用する必要があるでしょうWeekDay.Valueし、個々のメンバーを修飾します。したがって、例は次のようになります

def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun)

2番目の質問は、の意味についてval Mon, ... = Valueです。これは、の実装を調べないと、非常に混乱しますEnumeration。これはタイプの割り当てではありません!これは、代わりに保護呼んでいる同じ名前のメソッドValueタイプの具体的なインスタンスを返します、Value

あなたが書くことができるということが起こるval a, b, c = fooScalaで、それぞれの値についてabおよびc方法は、foo何度も何度も呼び出されます。Enumerationこのトリックを使用して、各値が個別になるように内部カウンターをインクリメントします。

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


2
ありがとう、これは非常に混乱しますが、私はそれが正しいと思います。代わりに、密封されたケースクラスを使用します。100%簡単です。
カレルビレク

2
私も個人的には密封されたケースクラスを好みます。もう少し冗長ですが、変更可能な内部カウンターなどを備えたhokus-pokusは少なくなります。Scala 2.10では、列挙型(Javaとは異なり、言語構造ではなく単なるライブラリソリューション)をマクロを使用してより適切に記述できる方法がいくつかあります。
0__

@ 0__ Scalaでenumを置き換えるためになぜそしてどのようにシールされたクラスを使用するのか尋ねてもいいですか?Scalaの列挙に問題はありますか?
x1a0 2013

Enum値自体にメンバーがある場合はどうなりますか?たとえば、Mon(8,20)、...、Sun(0,0)のように、各曜日の営業時間をどのように定義しますか?
simou 2014年

1
@simouでは、実際に封印された特性と実際のサブクラスを使用する必要があります。ただし、そのシナリオを「列挙」と呼ぶことはほとんどありません。あなたはもっと書くかもしれませんOpen(Mon, 8, 20)し、日はフラットな列挙のままです。
0__ 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.