1. ホーム
  2. scala

[解決済み] scalaの列挙を理解する

2022-08-01 08:06:12

質問

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 ?

どのように解決するのですか?

その 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 . これは型の代入ではありません! これは型の代入ではありません!代わりに protected された メソッドを呼び出しているのです。 , Value 型の具象インスタンスを返す Value .

と書くことができるのは偶然です。 val a, b, c = foo と書くと、それぞれの値に対して a , b そして c メソッド foo は何度も呼ばれることになります。 Enumeration はこのトリックを使って内部カウンターをインクリメントし、各値が個別になるようにしています。

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