簡體   English   中英

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

[英]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返回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

以下隱式轉換將為您解決問題:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM