object CardNum extends Enumeration
{
type CardNum = Value;
val THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE,
TEN, JACK, QUEEN, KING, ACE, TWO = Value
}
上面显示了我的枚举。我想比较枚举的顺序,例如检查它是否遵循枚举中定义的顺序。我尝试使用compareTo()方法,但它只返回-1,0或1的值。与Java不同,它将返回枚举之间的距离。例如,我使用了这段代码。
1 - println(CardNum.FIVE.compareTo(CardNum.EIGHT))
2 - println(CardNum.SEVEN.compareTo(CardNum.EIGHT))
句子1和句子2都给出了与-1相同的结果,这使我无法检测用户是否遵循枚举的顺序。在Java中没有问题,因为句子1会给我结果-3和句子2 -1。有没有办法在Scala中这样做?对不起,我对Scala缺乏经验。
答案 0 :(得分:1)
您可以使用元素id
之间的差异:
scala> CardNum.FIVE.id - CardNum.EIGHT.id
res1: Int = -3
scala> CardNum.SEVEN.id - CardNum.EIGHT.id
res2: Int = -1
答案 1 :(得分:0)
您应该包含Kolmar描述的逻辑,以了解枚举中两张卡之间的距离或使用隐式类,这样可以更简单地搜索代码中的引用,并以透明的方式进行更改(例如,这将允许你要改变枚举顺序)
object CardNum extends Enumeration {
protected case class CardVal() extends super.Val {
def distance(that: CardVal) = this.id - that.id
}
type CardNum = Val;
val THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE,
TEN, JACK, QUEEN, KING, ACE, TWO = CardVal()
}
implicit class EnhancedCard(card: CardNum.CardNum) {
def distance(that: CardNum.CardNum): Int = card.id - that.id
}
使用此解决方案,您需要在范围内使用隐式类。