Scala为类型分配一个动态值

时间:2018-07-04 12:05:15

标签: scala dynamic typing

我对Scala还是很陌生,我想知道是否有可能以某种方式动态创建类型。在实践中,我想要实现的目标是这样的:

trait BaseAB
case class A(value: String) extends BaseAB
case class B(value: String) extends BaseAB

def build(name: String, m: String): BaseAB = {
  type t = name match {
    case "A" => A
    base "B" => B
  }
  new t(m)
}

2 个答案:

答案 0 :(得分:3)

您只需在您的case子句中创建新实例,例如

case "A" => A(m)
case "B" => B(m)

或者您可以创建表示构造函数的部分应用函数,然后提供值

def build(name: String, m: String): BaseAB = {
  val construct = name match {
    case "A" => A.apply _
    case "B" => B.apply _
  }
  construct(m)
} 

> build("A", "boo") 
res25: BaseAB = A("boo")

答案 1 :(得分:1)

您的代码几乎按原样工作,但这不是因为存在某种“类型值运行时定义的变量”。相反,它之所以有效,是因为存在名为AB的伴随对象,它们具有方法apply(s: String): Aapply(s: String): B,并且都符合类型String => BaseAB

trait BaseAB
case class A(value: String) extends BaseAB
case class B(value: String) extends BaseAB

def build(name: String, m: String): BaseAB = {
  val t = name match {
    case "A" => A
    case "B" => B
  }
  t(m)
}

在此代码段中,t的类型被推断为String => BaseAB(可能带有一些其他标记特征,例如Serializable)。

如果您确定只有"A""B",也可以将其写为

  (if (name == "A") A else B)(m)

其工作原理相同。