我有一个用例,我需要定义一个新的枚举类型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 *
...有没有办法提取枚举的值?或者我不明白枚举类型是如何工作的?
答案 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