以下は、私が使用したい特性です
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;
}
}
すでに 2 つの方法を試しましたが、どちらも失敗したことがわかります。最初の使用法は次のようになります。
MyEnumeration(index).next
これにより、この列挙の次の値が返されます
2 番目の使用法は次のようになります。
MyEnumeration.nextValue(MyEnumeration(index))
もう一度、これは次の値を返します。
しかし、どちらの場合も、どのタイプがどちらであるかという問題があります。特性の内部でValue
は、実際にCircularEnumeration.Value
は、この特性を持つクラスの内部にあるためValue
です。MyEnumeration.Value
何か案は?