在 Scala 中获取所有 enum-y case 对象值

Getting all enum-y case object values in Scala

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

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

以下两种方法之一可行:

注意: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 已经(应该)满足上述需求。

参考文献:

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