简体   繁体   中英

Scala assign type a dynamic value

I'm pretty new to Scala and I'm wondering if it is possible to create a type dynamically in some way. In practice what I want to achieve is something like this:

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

You can just create new instances in you case clauses, like

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

or you can create partially applied function representing constructor and then provide value

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")

Your code works almost as-is, but it's not because there is some sort of "type-valued runtime-defined variables". Instead, it works because there are companion objects called A and B that have methods apply(s: String): A and apply(s: String): B , and also both conform to type 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)
}

In this code snippet, the type of t is inferred to be String => BaseAB (possibly with some additional marker traits like Serializable ).

If you are sure that there are only "A" and "B" , you can also write it as

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

it works for the same reason.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM