枚举中的值类型是如何工作的



这两个片段之间有什么区别

object Main extends Enumeration {
val first : String = "Thriller"
val second : String = "Horror"
val third : String = "Comedy"
val fourth : String = "Romance"
// Main Method
def main(args: Array[String]) {
println(s" Movie Genres = ${Main.first}")
}
}

object Main extends Enumeration
{
type Main = Value

// Assigning values
val first = Value("Thriller")
val second = Value("Horror")
val third = Value("Comedy")
val fourth = Value("Romance")

// Main method
def main(args: Array[String])
{
println(s"Main Movie Genres = ${Main.values}")
}
}

在第二段代码中使用type Main = Value有什么好处?即使在网上读了很多书,我也很难理解这一点。如果可能的话,请分享一些简单的理解。

因为在Java中,当我们在下面的代码中定义这个时,所有的值(HEARTS、DIAMOND等(都是CardSuit类型的,所以我们不能说(第一、第二等(是Main类型的吗?

enum CardSuit{
HEARTS,
DIAMONDS,
CLUBS,
SPADES,
}

最后一个问题是,有没有办法让2个以上的属性分配给scala中的任何枚举常量?例如val first = Value("Thriller", "movie, "london", "production")

枚举使用了私有构造函数和其他技巧:

  • 在用Enumeration扩展的object中定义类型Value
  • 限制构造函数,以便只能从对象内部调用它们
  • 让这些构造函数产生副作用,这样每个新值都会将自己附加到可变列表中(从外部来看是不可变的(

这种方法有几个问题:

  1. 执行object MyEnum extends Enumeration时,枚举将不会定义为MyEnum类型,而是定义为MyEnum.Value
  2. 如果要使用MyEnum作为枚举的名称,则必须使用类型别名type MyEnum = MyEnum.Valuetype MyEnum = Value
  3. 然而伴随物的类型仍将是CCD_ 13而不是CCD_。创建MyEnum.MyEnumMyEnum.MyEnum.type的别名太傻了
  4. 每个值都属于相同的类型,因此类型级编程选项非常有限
  5. 您不能自定义Value:让它继承您的类型,添加一些字段,存储String以外的内容,而不存储任何内容

第1点。和2。是人们进行类型别名的原因。这5个都是人们转向封闭特征的原因

sealed trait MyEnum extends Product with Serializable
object MyEnum {
case object One extends MyEnum
case object Two extends MyEnum
case object Three extends MyEnum
}

它们在模式匹配、派生方面工作得更好,更容易定制它们(你只需将东西添加到公共特征/公共抽象类中(等等。

在Scala 3中,它被简化为

enum MyEnum:
case One, Two, Three

总而言之,除了遗留代码之外,使用Enumeration的理由几乎为零。

最新更新