generic - scala implicit
¿Cómo puedo obtener fácilmente el nombre de una clase de caso Scala? (5)
Aquí hay una función de Scala que genera una cadena legible por humanos de cualquier tipo, recurriendo a los parámetros de tipo:
https://gist.github.com/erikerlandson/78d8c33419055b98d701
import scala.reflect.runtime.universe._
object TypeString {
// return a human-readable type string for type argument ''T''
// typeString[Int] returns "Int"
def typeString[T :TypeTag]: String = {
def work(t: Type): String = {
t match { case TypeRef(pre, sym, args) =>
val ss = sym.toString.stripPrefix("trait ").stripPrefix("class ").stripPrefix("type ")
val as = args.map(work)
if (ss.startsWith("Function")) {
val arity = args.length - 1
"(" + (as.take(arity).mkString(",")) + ")" + "=>" + as.drop(arity).head
} else {
if (args.length <= 0) ss else (ss + "[" + as.mkString(",") + "]")
}
}
}
work(typeOf[T])
}
// get the type string of an argument:
// typeString(2) returns "Int"
def typeString[T :TypeTag](x: T): String = typeString[T]
}
Dado:
case class FirstCC {
def name: String = ... // something that will give "FirstCC"
}
case class SecondCC extends FirstCC
val one = FirstCC()
val two = SecondCC()
¿Cómo puedo obtener "FirstCC"
de one.name
y "SecondCC"
de two.name
?
Puede usar la propiedad productPrefix
de la clase de caso:
case class FirstCC {
def name = productPrefix
}
case class SecondCC extends FirstCC
val one = FirstCC()
val two = SecondCC()
one.name
two.name
NB: Si pasas a scala 2.8 extendiendo una clase de caja han sido desaprobados, y no debes olvidar el padre izquierdo y derecho ()
class Example {
private def className[A](a: A)(implicit m: Manifest[A]) = m.toString
override def toString = className(this)
}
def name = this.getClass.getName
def name = this.getClass.getName
O si solo quieres el nombre sin el paquete:
def name = this.getClass.getSimpleName
Consulte la documentación de java.lang.Class para obtener más información.