Scala:如何定义具有额外属性的枚举?

时间:2017-02-16 13:56:39

标签: scala

我有一个用例,我需要定义一个新的枚举类型LongShort,但我需要它以一种方式来携带符号,因此它可以直接用于数学表达式,例如。

object LongShortType extends Enumeration {
    type Type = Value
    val Long = Value(+1)
    val Short = Value(-1)
}

我希望像这样使用它:

val longShort = LongShortType.Short 
val numberOfContracts: Int = 10
val vanillaOptionNotional: Double = longShort*numberOfContracts

但是这会导致编译器错误cannot resolve symbol * ...有没有办法提取枚举的值?或者我不明白枚举类型是如何工作的?

2 个答案:

答案 0 :(得分:1)

LongShortType.Short的类型不是Int,而是Value。您可以提取值的基础ID:

val longShort = LongShortType.Short.id

哪个有点难看。或者你根本不能使用枚举类型:

object LongShortType {
  val Long = 1
  val Short = -1 
}

然后你的等式就可以了。

答案 1 :(得分:1)

好的,我找到了一个解决方案来实现我想要的,没有任何妥协,我的意思是这个解决方案具有使用Scala枚举的所有优点,例如withName并且仍允许我在其上定义额外的功能:

object LongShortType extends Enumeration {
  type Type = LongShortVal
  val Long = Value("Long", +1)
  val Short = Value("Short", -1)
  case class LongShortVal(name: String, sign: Int) extends Val(nextId, name)
  protected final def Value(name: String, sign: Int) = new LongShortVal(name, sign)
}

现在可以做到:

val longShort = LongShortType.Short 
val numberOfContracts: Int = 10
val vanillaOptionNotional: Double = longShort.sign*numberOfContracts

也可以这样做:

val longShort = LongShort.withName("Long") // returns LongShort.Long