6

私は(ここから)Scalaメタデータを取得するためにエクストラクターを使用することを学びました。私も気づきましたUniverse.MethodTypeExtractor

作成するエクストラクタクラスと構文とのパターンマッチング MethodType(params, respte)ここで、paramsはメソッドのパラメータシンボルの空の可能性のあるリストであり、restpeはメソッドの結果タイプです。

素晴らしい!私が欲しいもののように聞こえます!(?)

しかし、どのように取得するのMethodTypeですか?(そして、なぜこれは、メソッド「Def」または「Ref」とは対照的に、メソッド「type」(メソッド「types」ですか?)のエクストラクタですか?)

scala> typeOf[List[Int]].member(newTermName("head"))
res2: reflect.runtime.universe.Symbol = method head

scala> res2 match { case MethodType(a, b) => println((a, b)) }
scala.MatchError: method head (of class scala.reflect.internal.Symbols$MethodSymbol) [...]

scala> res2.asType match { case MethodType(a, b) => println((a, b)) }
scala.ScalaReflectionException: method head is not a type [...]

scala> res2.asTerm match { case MethodType(a, b) => println((a, b)) }
scala.MatchError: method head (of class scala.reflect.internal.Symbols$MethodSymbol) [...]

scala> res2.asMethod match { case MethodType(a, b) => println((a, b)) }
scala.MatchError: method head (of class scala.reflect.internal.Symbols$MethodSymbol) [...]

それとも、いわば完全に「間違った木を吠えている」のでしょうか。

4

1 に答える 1

4

paramss(これはRC1名であり、M7では名前が付けられていますparams)そしてreturnTypeMethodSymbolのメソッドです:

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._

scala> typeOf[List[Int]].member(newTermName("head"))
res2: reflect.runtime.universe.Symbol = method head

scala> res2.asMethod.paramss
res4: List[List[reflect.runtime.universe.Symbol]] = List()

scala> res2.asMethod.returnType
res5: reflect.runtime.universe.Type = A

typeSignatureメソッドの型シグネチャを取得するには、で定義されたメソッドを呼び出す必要がありますSymbol

メソッドが型である理由について言えば、そう言うのは完全には正しくありません。DefDefツリー、MethodSymbolシンボル、およびMethodType/タイプがあり、NullaryMethodTypeそれぞれがコンパイラー内で独自の目的を果たします。間もなくリフレクションAPIのドキュメントが完成するので、状況がより明確になることを願っています。

于 2012-10-12T08:25:05.010 に答える