鉴于以下内容:
scala> trait Foo
defined trait Foo
scala> case object Bip extends Foo
defined module Bip
scala> case object Bar extends Foo
defined module Bar
Scala内置的任何功能是否可以从Foo
生成String
?
示例:
f("Bip")
=== Bip
f("Bar")
=== Bar
f("...")
===异常(或者可能会返回None
)?
答案 0 :(得分:2)
您可以使用宏,但使用简单的Java反射可能更容易:
namespace org.example
import scala.util.control.Exception._
object Demo extends App {
sealed trait Foo
case class Bar() extends Foo
case class Bip() extends Foo
def makeFoo(s: String): Option[Foo] = {
catching(classOf[Exception]).opt(Class.forName("org.example.Demo$" + s).newInstance.asInstanceOf[Foo])
}
println(makeFoo("Bar")) // Some(Bar())
println(makeFoo("Bip")) // Some(Bip())
println(makeFoo("Bop")) // None
}
如果将所有案例类放在一个像上面那样的对象容器中,那么类名应该是可预测的。
编辑:为特殊情况添加了可选包装。