4

在 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

如何colonType在 REPL 之外的 Scala 程序中获得这样的“”方法(我没有:type可用的命令)?

4

4 回答 4

7

我查看了 REPL 的来源(或者更好的包含 REPL 的 scalac )并发现了这个(Source):

private def replInfo(sym: Symbol) = {
  sym.info match {
    case NullaryMethodType(restpe) if sym.isAccessor => restpe
    case info => info
  }
}

返回一个(Source)的方法info。稍后在此类型上调用,因此如果您想要相同的类型信息,您应该执行相同的操作:scala.reflect.internal.Symbols.SymbolTypetoString

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
于 2012-07-14T20:00:52.213 回答
3

以下隐式转换应该为您解决问题:

import reflect.runtime.universe._

implicit class ColonTypeExtender [T : TypeTag] (x : T) {
  def colonType = typeOf[T].toString
}
于 2012-07-15T17:01:41.410 回答
1

这是你想要达到的吗?

val s = "House"
println(s.getClass.getName)       // java.lang.String
println(s.getClass.getSimpleName) // String
于 2012-07-14T18:32:32.247 回答
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> 
于 2015-03-28T13:26:11.693 回答