【问题标题】:Scala assign type a dynamic valueScala为类型分配一个动态值
【发布时间】:2018-07-04 12:05:15
【问题描述】:

我对 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)
}

【问题讨论】:

标签: scala dynamic typing


【解决方案1】:

您可以在 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")

【讨论】:

    【解决方案2】:

    您的代码几乎可以按原样运行,但这并不是因为存在某种“类型值运行时定义的变量”。相反,它之所以有效,是因为有名为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)
    }
    

    在这段代码 sn-p 中,t 的类型被推断为 String => BaseAB(可能带有一些额外的标记特征,例如 Serializable)。

    如果你确定只有"A""B",也可以写成

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

    出于同样的原因。

    【讨论】:

      猜你喜欢
      • 2015-09-05
      • 2019-11-25
      • 2021-10-22
      • 2021-12-10
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 2021-02-24
      • 2020-02-13
      相关资源
      最近更新 更多