Scala で式の型を調べることはできますか? これは、複雑な部分関数、暗黙的な変換などをデバッグするときに特に役立ちます...
例えば:
println( typeOf( x+y ) )
Scala で式の型を調べることはできますか? これは、複雑な部分関数、暗黙的な変換などをデバッグするときに特に役立ちます...
例えば:
println( typeOf( x+y ) )
scala コンソールでは、以下を使用できます:type
。
:type x+y
実行時に (コンソールを含む)、次のことができます。
scala> import reflect.ClassTag
import reflect.ClassTag
scala> def exprType[T:ClassTag]( x: T ) = implicitly[ClassTag[T]]
exprType: [T](x: T)(implicit evidence$1: scala.reflect.ClassTag[T])scala.reflect.ClassTag[T]
scala> exprType( x+y)
res1: scala.reflect.ClassTag[String] = java.lang.String
exprType はClassTag
パラメータを返します。ClassTag は消去に対して回復力がないため、TypeTag
代わりに a を使用することをお勧めします (ただし、これにはクラスパスに「scala-reflect.jar」が必要です)。
import reflect.runtime.universe._
def exprType[T:TypeTag]( x: T ) = implicitly[TypeTag[T]]
指定したとおりに印刷する場合は、次のようにします。
scala> def manOf[T: Manifest](t: T): Manifest[T] = manifest[T]
manOf: [T](t: T)(implicit evidence$1: Manifest[T])Manifest[T]
scala> val x = List(1,2,3)
x: List[Int] = List(1, 2, 3)
scala> println(manOf(x))
scala.collection.immutable.List[Int]
交換モードの場合
scala> :type List(1,2,3)
List[Int]