[英]How can I get the functionality of the Scala REPL :type command in my Scala program
在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
命令)?
我查看了REPL的來源(或者更好的包含REPL的斯卡拉克),發現了這一點( 來源 ):
private def replInfo(sym: Symbol) = {
sym.info match {
case NullaryMethodType(restpe) if sym.isAccessor => restpe
case info => info
}
}
scala.reflect.internal.Symbols.Symbol
方法info
返回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
以下隱式轉換將為您解決問題:
import reflect.runtime.universe._
implicit class ColonTypeExtender [T : TypeTag] (x : T) {
def colonType = typeOf[T].toString
}
這就是您想要實現的目標嗎?
val s = "House"
println(s.getClass.getName) // java.lang.String
println(s.getClass.getSimpleName) // String
經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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.