获取Scala中的所有枚举案例对象值

时间:2015-03-17 07:11:31

标签: scala reflection enums macros

在Scala中,枚举是一个有争议的领域,许多人(包括我自己)比任何基于库的枚举都使用case object。这很好,除了那个没有得到所有可能值的列表,有时需要它。我手动维护了这些列表(allKeys),但这很乏味且容易出错。

问题是:如何使用Scala 2.11 TypeTags或反射来创建这样的列表?

两种方法之一可行:

  • 获取sealed类的所有派生实例
  • 获取在特定对象中声明的所有case object

注意:samples似乎承诺我正在寻找什么。但这太过分了 - 必须有一个差不多的单线才能得到相同的效果?

以下是对此的测试。我怎样才能实现allOf函数?

class ManifestToolsTest extends UnitTest {

  behavior of "ManifestTools" {

    sealed class MyEnum

    object MyEnum {
      case object A extends MyEnum
      case object B extends MyEnum
      case object C extends MyEnum

      val x= 10           // should not be listed
      def f(x: Int) = x   // should not be listed
    }

    def allOf[T]: Seq[T] = {
      ...  
    }

    it should "be able to list the 'case object' members of an object" in {

      val tmp: Seq[MyEnum] = allOf[MyEnum]
      tmp should contain theSameElementsAs( List(MyEnum.A, MyEnum.B, MyEnum.C) )
    }
  }
}

我试图从Scala文档中获取此信息,但是当涉及到反射时,事情确实是抽象的。我相信上述需求(应该)由Scala 2.11涵盖。

参考文献:

1 个答案:

答案 0 :(得分:3)

我找到了名为Enumeratum的cure,但我认为无论如何我都会发布这个问题,以便人们更容易找到这件新的宏观珠宝。