У меня есть функция, и я хотел бы получить ее типы параметров и возвращаемый тип для использования в макросах Scala.
scala> val fn = (a: String, b: Double) => 123
fn: (String, Double) => Int = <function2>
scala> fn.getClass
res1: Class[_ <: (String, Double) => Int] = class $anonfun$1
В приведенном выше примере типы параметров и тип возвращаемого значения уже напечатаны в обеих строках, но я не знаю, как получить к ним доступ. Даже с toString
я бы застрял с частями <function2>
и class $anonfun$1
справа от знака =
, иначе можно было бы немного уродливого синтаксического анализа строки.
Я обнаружил, что MethodSymbolApi
предлагает способ извлечения этой информации для методов, но похоже, что это может не помочь в данном конкретном случае.
В настоящее время я изучаю синтаксический анализ AST (как часть scala.meta
) для извлечения информации, но я думаю, что этот вопрос покажется достаточно простым, чтобы его можно было охватить стандартной библиотекой отражения, хотя мне не удалось найти то, что я хочу в там. Есть идеи?
Изменить на основе ответа @johanandren:
Я еще не нашел более аккуратного способа извлечь их из TypeTag/Type, но это уже работает. :)
scala> val fn = (a: String, b: Double) => 123
scala> import scala.reflect.runtime.{universe => ru}
scala> def getTypeTag[T: ru.TypeTag](obj: T) = ru.typeTag[T]
scala> getTypeTag(fn).tpe.toString.split(" => ")
res179: Array[String] = Array((String, Double), Int)