在REPL中有一个打印类型的命令:
scala> val s = "House"
scala> import scala.reflect.runtime.universe._
scala> val li = typeOf[List[Int]]
scala> :type s
String
scala> :type li
reflect.runtime.universe.Type
如何在我的Scala程序中获得这个“:type expr”功能来打印类型?
让我澄清一下我想要的“:type expr”功能,如下所示:
println(s.colonType) // String
println(li.colonType) // reflect.runtime.universe.Type
如何在REPL之外的Scala程序中获得这样的“colonType
”方法(我没有:type
命令可用)?
答案 0 :(得分:7)
我查看了REPL的来源(或更好的包含REPL的scalac)并找到了这个(Source):
private def replInfo(sym: Symbol) = {
sym.info match {
case NullaryMethodType(restpe) if sym.isAccessor => restpe
case info => info
}
}
info
的方法scala.reflect.internal.Symbols.Symbol
会返回Type
(Source)。稍后会在此类型上调用toString
,因此如果您需要相同的类型信息,则应该执行相同的操作:
scala> import scala.reflect.runtime.{universe => u}
import scala.reflect.runtime.{universe=>u}
scala> u.typeOf[List[String]].toString
res26: String = scala.List[String]
scala> u.typeOf[Int => String].toString
res27: String = Int => String
答案 1 :(得分:3)
以下隐式转换应该适合您:
import reflect.runtime.universe._
implicit class ColonTypeExtender [T : TypeTag] (x : T) {
def colonType = typeOf[T].toString
}
答案 2 :(得分:1)
这是你想要达到的目标吗?
val s = "House"
println(s.getClass.getName) // java.lang.String
println(s.getClass.getSimpleName) // String
答案 3 :(得分:0)
使用Scala REPL 2.11测试:
在函数名称后添加_以将其视为部分应用函数。
示例:
scala> def addWithSyntaxSugar(x: Int) = (y:Int) => x + y
addWithSyntaxSugar: (x: Int)Int => Int
scala> addWithSyntaxSugar _
res0: Int => (Int => Int) = <function1>
scala>