Scala 为类型分配一个动态值
Scala assign type a dynamic value
我是 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)
}
您可以在 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")
您的代码几乎按原样工作,但这并不是因为有某种 "type-valued runtime-defined variables"。相反,它之所以有效,是因为有名为 A
和 B
的伴随对象,它们具有方法 apply(s: String): A
和 apply(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)
出于同样的原因,它也有效。
我是 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)
}
您可以在 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")
您的代码几乎按原样工作,但这并不是因为有某种 "type-valued runtime-defined variables"。相反,它之所以有效,是因为有名为 A
和 B
的伴随对象,它们具有方法 apply(s: String): A
和 apply(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)
出于同样的原因,它也有效。