首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scala枚举中的ordinal()方法

scala枚举中的ordinal()方法
EN

Stack Overflow用户
提问于 2016-06-20 03:36:26
回答 2查看 931关注 0票数 1

在java中,我得到了枚举

代码语言:javascript
复制
enum Num {
    ONE,
    TWO,
    THREE;

    private static Num current = ONE;
    private static Num next = TWO;

    public Num getNext(){
        return values()[(ordinal() + 1) % values().length];
    }

    public static Num getNextNum(){
       next = current.getNext()
    }
}

因此,我能够以调用getNextNum()的方式赋值next,但是在我看来,scala枚举缺少这个特性。除了在scala代码中使用java枚举之外,你还知道其他的解决方法吗?

EN

回答 2

Stack Overflow用户

发布于 2016-06-20 05:03:39

看一看Case objects vs Enumerations in Scala

在Scala中,枚举的功能有限,如果您想将功能添加到枚举中,最好使用密封的特征。例如:

代码语言:javascript
复制
sealed trait Num {
  val next: Num
}
case object ONE extends Num {
  override val next = TWO
}
case object TWO extends Num {
  override val next = THREE
}
case object THREE extends Num {
  override lazy val next = ONE
}

同样在你的例子中,这有点棘手,因为你想在初始化之前引用一个值。所以在最后一个定义上有一个延迟(如果你愿意,你也可以把next定义为def )

票数 2
EN

Stack Overflow用户

发布于 2016-06-20 16:38:55

如果你想使用标准的Scala来实现这个行为,你可以将Enumeration#Value重新定义为你的Enumeration的实例:

代码语言:javascript
复制
object Num extends Enumeration {
  case class MyValue() extends Val {
    def next: MyValue = Num((id + 1) % Num.values.size).asInstanceOf[MyValue]
  }
  val One, Two, Three = MyValue()
}

Num.One.next
// res0: Num.MyValue = Two

然而,由于枚举是糟糕的,因为so many reasons,以及没有一致的集成开发环境支持,我个人会对枚举的case对象使用密封的特征(请查看enumeratum),它允许为我的枚举引入任意逻辑,因为它可以精确地控制发生的事情。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37911081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档