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プログラムでこの「:typeexpr」機能を取得して型を出力するにはどうすればよいですか?

私が持っていたい「:typeexpr」機能を明確にしましょう。次のようなものです。

println(s.colonType)   // String
println(li.colonType)  // reflect.runtime.universe.Type

colonTypeREPLの外部(:typeコマンドを使用できない場合)のScalaプログラムでこのような ""メソッドを取得するにはどうすればよいですか?

4

4 に答える 4

7

私はREPL(またはREPLを含むscalacのより良いもの)のソースを調べて、これを見つけました(ソース):

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

Sourceinfo )をscala.reflect.internal.Symbols.Symbol返すメソッド。後でこのタイプで呼び出されるため、同じタイプ情報が必要な場合は同じことを行う必要があります。TypetoString

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 に答える