如何在类中使用Scala枚举

时间:2016-09-09 00:45:03

标签: scala enums

我正在学习Scala,我正在尝试为项目设置一个简单的枚举设置。我已经检查了一些示例,似乎没有一个示例,Scala文档和StackOverflow中的所有示例都是针对 objects 中的枚举,而不是类。我收到了一个我不明白的IDE警告。我是从初学者Java背景进入Scala,这可能是我混乱的原因。

以下是代码:

class Car(maxSpeed: Integer) {

  // Enums
  object CarType extends Enumeration {
    type CarType = Value
    val PERIPHERAL, COMPUTER, EMPTY = Value
  }
  import CarType._

  // Fields
   val repeated: CarType
}

当我将鼠标移到班级名称上时,我可以看到这个Intellij警告:

  

类'Car'必须被声明为abstract或实现抽象成员'typed:'Car'中的Car.this.CarType.CarType'

我不确定为什么它要我实现我的变量,而且这个类并不是抽象的。我想像在Java中使用它们一样使用Enums。

2 个答案:

答案 0 :(得分:5)

将枚举移到课堂外:

// Enums
object CarType extends Enumeration {
  type CarType = Value
  val PERIPHERAL, COMPUTER, EMPTY = Value
}
class Car(maxSpeed: Integer) {
  import CarType._

  // Fields
   val repeated: CarType
}

或将其移至companion对象:

class Car(maxSpeed: Integer) {
  import Car.CarType._

  // Fields
   val repeated: CarType
}

object Car {
  object CarType extends Enumeration {
    type CarType = Value
    val PERIPHERAL, COMPUTER, EMPTY = Value
  }
}

问题在于,在类里面定义的东西的范围是该类的实例(与其他一些语言不同)。

那就是说,我建议使用代数数据类型而不是枚举:

sealed trait CarType
object CarType {
  case object Peripheral extends CarType // strange choice of names
  case object Computer extends CarType
  case object Empty extends CarType
}

case class Car(maxSpeed: Int, carType: CarType)

答案 1 :(得分:0)

您要找的是Scala Case Class

class Car(maxSpeed: Integer)
case class Minivan(maxSpeed: Integer) extends Car(maxSpeed: Integer)
case class Hodrod(maxSpeed: Integer) extends Car(maxSpeed: Integer)
case class Coupe(maxSpeed: Integer) extends Car(maxSpeed: Integer)

Scala中并没有真正使用Java中存在的枚举。通过像我上面的结构一样,你可以利用Scala强大的pattern matching做这样的事情:

val unknownCar = getCar() // Some function that gets a car
unknownCar match {
  case Minivan => println("Driving the kids")
  case Hodrod => println("Tearing up the drag")
  case Coupe => println("Riding low")
}

...同时仍允许您将其视为Car

因为它们是案例类,所以Scala有很多东西可以帮助你。

请注意documentation for Enumeration

  

通常,这些值枚举可以采用的所有可能形式,并为案例类提供轻量级替代。

如果您不打算将这些值用于其他任何事情,那么您应该只使用它 - 但即使是案例类通常也会为您提供更好的服务。