【问题标题】:Rich enumeration with iteration in ScalaScala 中带有迭代的丰富枚举
【发布时间】:2014-02-15 03:00:36
【问题描述】:

我正在尝试在 Scala 中实现 Rich 枚举,其中我的枚举还必须实现例如 trait。

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

Travis Brown Iteration over a sealed trait in Scala? 建议有一种简单的方法来实现此功能,而无需使用宏和密封特征?

【问题讨论】:

    标签: scala enumeration


    【解决方案1】:

    使用 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)
    

    【讨论】:

    • 类型转换是强类型编程语言的死亡。
    • 不幸的是,你有时需要使用它们,不管你喜欢与否。
    【解决方案2】:

    您可能必须先转换:

    Enumeration and mapping with Scala 2.10

    我想这两个答案都是相关的,但我完全忘记了我的答案。

    这个话题

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

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

    提前停在路上:

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

    【讨论】:

    • 我认为最后一个链接说得对:“老实说,我不会使用枚举。这是一个源自 Scala 1.0 (2004) 的类”
    【解决方案3】:

    您是否尝试过隐式转换?请记住保持范围紧凑:

    // 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


    通过Sean Ross查看Better example

    【讨论】:

    • 好收获。它更好地利用了枚举。
    • 答案是一样的。我是演员阵容的大敌 :)
    • 如果您这么认为,请继续编写您自己的实现(我会亲自接管演员阵容而不是重新发明轮子)。规则是用来打破的。
    猜你喜欢
    • 1970-01-01
    • 2011-02-07
    • 2011-06-12
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多