鉴于:
case class Thing(a:Int, b:String, c:Double)
val v = Vector(1, "str", 7.3)
我想要一些能神奇地创造的东西:
Thing(1, "str", 7.3)
这样的东西是否存在(对于任意大小的东西)?
鉴于:
case class Thing(a:Int, b:String, c:Double)
val v = Vector(1, "str", 7.3)
我想要一些能神奇地创造的东西:
Thing(1, "str", 7.3)
这样的东西是否存在(对于任意大小的东西)?
我第一次涉足 2.10 实验反射设施。所以主要遵循这个大纲http://docs.scala-lang.org/overviews/reflection/overview.html,我想出了这个:
import scala.reflect.runtime.{universe=>ru}
case class Thing(a: Int, b: String, c: Double)
object Test {
def main(args: Array[String]) {
val v = Vector(1, "str", 7.3)
val thing: Thing = Ref.runtimeCtor[Thing](v)
println(thing) // prints: Thing(1,str,7.3)
}
}
object Ref {
def runtimeCtor[T: ru.TypeTag](args: Seq[Any]): T = {
val typeTag = ru.typeTag[T]
val runtimeMirror = ru.runtimeMirror(getClass.getClassLoader)
val classSymbol = typeTag.tpe.typeSymbol.asClass
val classMirror = runtimeMirror.reflectClass(classSymbol)
val constructorSymbol = typeTag.tpe.declaration(ru.nme.CONSTRUCTOR).asMethod
val constructorMirrror = classMirror.reflectConstructor(constructorSymbol)
constructorMirrror(args: _*).asInstanceOf[T]
}
}
请注意,当我在 main 方法中有 case 类时,它没有编译。我不知道是否只能为非内部案例类生成类型标记。
我不知道是否可以获得带有编译时错误的工作解决方案,但这是我使用匹配的解决方案:
case class Thing(a: Int, b: String, c: Double)
def printThing(t: Thing) {
println(t.toString)
}
implicit def vectToThing(v: Vector[Any]) = v match {
case (Vector(a: Int, b: String, c: Double)) => new Thing(a, b, c)
}
val v = Vector(1, "str", 7.3) // this is of type Vector[Any]
printThing(v) // prints Thing(1,str,7.3)
printThing(Vector(2.0, 1.0)) // this is actually a MatchError
这种“事物”转换是否有实际目的,还是您宁愿使用 Tuple3[Int,String,Double] 而不是 Vector[Any]?
从您的问题来看,尚不清楚您将使用它来做什么。您所说的事物实际上可能是 HList 或 KList。HList 代表异构列表,它是一个“任意长度的元组”。
我不确定添加“unnapply”或“unapplySeq”方法以使其表现得更像一个案例类有多难。
我对他们没有什么经验,但可以在这里找到一个很好的解释:http: //apocalisp.wordpress.com/2010/06/08/type-level-programming-in-scala/
如果这不是您所需要的,最好告诉我们您想要实现的目标。