在 Scala 中获取所有 enum-y case 对象值
Getting all enum-y case object values in Scala
在 Scala 中,枚举是一个有争议的领域,许多人(包括我自己)宁愿使用 case object
s 而不是任何基于库的枚举。这很好,除了没有得到所有可能值的列表,有时需要。我手动维护了这样的列表 (allKeys
),但这很乏味且容易出错。
问题是:如何使用 Scala 2.11 TypeTags 或反射来创建这样的列表?
以下两种方法之一可行:
- 获取
sealed
class 的所有派生实例
- 获取在特定对象中声明的所有
case object
s
注意: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 已经(应该)满足上述需求。
参考文献:
- Case objects vs Enumerations in Scala
我找到了名为 Enumeratum 的 cure,但我想我 post 这个问题无论如何都会让人们更容易找到这件新的宏观珠宝。
在 Scala 中,枚举是一个有争议的领域,许多人(包括我自己)宁愿使用 case object
s 而不是任何基于库的枚举。这很好,除了没有得到所有可能值的列表,有时需要。我手动维护了这样的列表 (allKeys
),但这很乏味且容易出错。
问题是:如何使用 Scala 2.11 TypeTags 或反射来创建这样的列表?
以下两种方法之一可行:
- 获取
sealed
class 的所有派生实例
- 获取在特定对象中声明的所有
case object
s
注意: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 已经(应该)满足上述需求。
参考文献:
- Case objects vs Enumerations in Scala
我找到了名为 Enumeratum 的 cure,但我想我 post 这个问题无论如何都会让人们更容易找到这件新的宏观珠宝。