可以通过编程方式定义Scala案例对象吗?

时间:2016-10-21 16:07:48

标签: scala reflection metaprogramming

在我目前的项目中,我需要定义很多case子对象,这些对象子类化了一个密封的trait。这些对象的名称具有模式,例如Case1,Case2,Case3,...,CaseN。我想知道scala中是否有方法以编程方式定义所有这些case对象,例如使用循环,而不是编写N行定义。

如果这是可行的,那么在编译时执行此操作也会很棒,以便以这种方式定义的case对象可以进行类型检查。在大多数语言中这听起来都是不可能的(你可以在python中使用动态定义的类型,或者像在C / C ++中那样具有静态类型安全性,但不能同时使用这两种类型),但是在Scala中它可以用于强大的编译时反射吗?

1 个答案:

答案 0 :(得分:0)

我正在考虑这个解决方案:

trait customTrait{
  val property: String
}

case class toMatch(property: String) extends customTrait{
}

val cases: Seq[toMatch] = for{
  x <- 0 until 10
} yield toMatch("property" + x)

def matchCase(caseToMatch: customTrait): String = caseToMatch match{

  case toMatch("property1") => "1"
  case toMatch("property2") => "2"
  case toMatch("property3") => "3"
  case toMatch("property4") => "4"
  case _ => "non"

}

for {
  x <- cases
} yield matchCase(x)
相关问题