如何在Scala程序中获得Scala REPL:type命令的功能

时间:2012-07-14 18:29:32

标签: scala

在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命令可用)?

4 个答案:

答案 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会返回TypeSource)。稍后会在此类型上调用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>