在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涵盖。
参考文献: