1

以下是我想使用的特征

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在具有此特性的类内部时ValueMyEnumeration.Value

有任何想法吗?

4

1 回答 1

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
于 2013-09-01T13:23:49.510 回答