在Scala中使用迭代进行丰富的枚举

时间:2014-02-14 16:45:20

标签: scala enumeration

我正在尝试在Scala中实现Rich枚举,我的枚举也必须实现例如特征。

这很好,但是当我尝试迭代枚举时,Enumeration.values返回一个ValueSet,它是Enumeration.Value的集合

是否有一种简单的方法可以实现此功能,而无需使用宏,并且Travis Brown建议使用密封特性Iteration over a sealed trait in Scala?

3 个答案:

答案 0 :(得分:3)

使用Enumeration类可以相对轻松地完成scala中的枚举。下面是一个例子。

trait Num {
  def echo
}

object Status extends Enumeration {

  case class StatusVal(code: Int, name: String) extends Val with Num {
    override def echo {
      println("Number: " + name)
    }
  }
  val ONE = StatusVal(1, "One")
  val TWO = StatusVal(2, "Two")
  val THREE = StatusVal(2, "Three")
}

Status.values foreach (s => s.asInstanceOf[Num].echo)

答案 1 :(得分:1)

您是否尝试过隐式转换?记得保持范围紧张:

// I have deliberated stolen @cyrillk example :). 
// Just add this line to the body os Status (Enumeration Object)
implicit def valueToNum(v: Value): Num = v.asInstanceOf[Num]

Value将隐式转换为Num,因此:

Status.values foreach (s => s.echo) // works!

Working Example


Better example之前Sean Ross

答案 2 :(得分:1)

您可能必须先转换:

Enumeration and mapping with Scala 2.10

我猜两个答案都有关系,但我完全忘记了我的答案。

这个帖子

https://groups.google.com/d/msg/scala-internals/8RWkccSRBxQ/snNuzjJakhkJ

可能标志着更换枚举的漫长道路的开始。它包含一些关于使用的不同(双关语警示)意见。

早点停在路上:

https://stackoverflow.com/a/4346618/1296806