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

如何在Scala程序中获得Scala REPL:type命令的功能,scala,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”功能以打印类型 让我澄清一下我想

在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

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

这就是您想要实现的吗

val s = "House"
println(s.getClass.getName)       // java.lang.String
println(s.getClass.getSimpleName) // String

我查看了REPL的源代码(或者包含REPL的scalac的更好版本),发现如下():

scala.reflect.internal.Symbols.Symbol的方法
info
返回一个
类型
()。稍后将对此类型调用
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

以下隐式转换应该可以满足您的需要:

import reflect.runtime.universe._

implicit class ColonTypeExtender [T : TypeTag] (x : T) {
  def colonType = typeOf[T].toString
}

使用Scala REPL 2.11进行测试:

在函数名后添加u,将其视为部分应用的函数

例如:

scala> def addWithSyntaxSugar(x: Int) = (y:Int) => x + y
addWithSyntaxSugar: (x: Int)Int => Int

scala> addWithSyntaxSugar _
res0: Int => (Int => Int) = <function1>

scala> 
scala>def addWithSyntaxSugar(x:Int)=(y:Int)=>x+y
addWithSyntaxSugar:(x:Int)Int=>Int
scala>addWithSyntaxSugar_
res0:Int=>(Int=>Int)=
斯卡拉>

对于第一个示例来说,这很好,但是对于第二个示例就不行了:`println(li.getClass.getName)//scala.reflect.internal.TypeRef$$anon$1而不是reflect.runtime.universe.TypeI我必须承认,我看不到第二个场景的用处。我可以看出获取类型信息
列表[Int]
可能会有所帮助,但是类型信息
如何反映.runtime.universe.type
帮助您呢?我希望在Scala程序中具有与REPL中提供的
:type
相同的功能<代码>:键入li
\\reflect.runtime.universe.type。因此,我想知道如何将此
reflect.runtime.universe.Type
打印为
li
的“:Type”。感谢您指出来源。但我不知道如何使用它来获得“
colonType
”方法(请参阅我原始问题的澄清编辑)。这就是我已经提到的。唯一的区别是隐式转换,如果不是。当问题是关于获取实例类型的名称时,您正在获取类型名称。@NikitaVolkov e.a.谢谢大家,解决方案有效!!在决定问我的第一个stackoverflow.com问题之前,我已经为此绞尽脑汁一周了。下次我不会犹豫那么久@user1525911:接下来你要做的就是接受这个答案,将它标记为你所寻找的答案。@sschaef Done。谢谢你教育我
scala> def addWithSyntaxSugar(x: Int) = (y:Int) => x + y
addWithSyntaxSugar: (x: Int)Int => Int

scala> addWithSyntaxSugar _
res0: Int => (Int => Int) = <function1>

scala>