尝试在Scala中实现循环枚举

时间:2013-09-01 11:13:27

标签: scala enumeration

以下是我想要使用的特性

trait CircularEnumeration extends Enumeration {

    class CircularVal extends Val {
      def next(): Value = {
        apply((id + 1) % values.size)
      }
    }

    protected override final def Value: CircularVal = new CircularVal;

    ///////////////////////////////////////////////////////////////////////////

    def nextValue(value: Value) = {
      //first way
      val nextIndex = values.toSeq.indexOf(value) + 1;
      val value_nomath = if (nextIndex >= values.size) {
        values.toSeq(0);
      }
      else {
        values.toSeq(nextIndex);
      }

      //second way
      val value_withmath = this((value.id + 1) % values.size);

      assert(value_nomath == value_withmath);

      value_withmath;
    }
}

你可以看到我已经尝试了两种方法,但都失败了。 在第一次使用将是这样的:
MyEnumeration(index).next
这将返回此枚举的下一个值

在第二个用法就是这样:
MyEnumeration.nextValue(MyEnumeration(index))
再一次,这将返回下一个值

但在两种情况下我都有哪种类型的问题。因为在特征内部,Value实际上是CircularEnumeration.Value而在具有此特征的类Value MyEnumeration.Value

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我相信我可以使用以下更改来修改它 - 修改nextValue的返回类型:

def nextValue(value: Value): CircularEnumeration.this.Value = {

和最后一行(返回值):

value_withmath.asInstanceOf[CircularEnumeration.this.Value]

然后,将MyEnumeration定义为:

scala> object MyEnumeration extends CircularEnumeration {
     |     type MyEnumeration = Value
     |     val Zero, One, Two, Three, Four = Value
     | }
defined module MyEnumeration

我们得到:

scala> MyEnumeration.nextValue(MyEnumeration(3))
res0: MyEnumeration.Value = Four

scala> MyEnumeration.nextValue(MyEnumeration(4))
res1: MyEnumeration.Value = Zero