является ли параметр метода неявным? - использование отражения scala 2.10

Учитывая отраженный метод:

scala> val sortMethod = typeOf[::[_]].member(newTermName("sorted"))
sortMethod: reflect.runtime.universe.Symbol = method sorted

scala> sortMethod.typeSignature
res122: reflect.runtime.universe.Type = [B >: A](implicit ord: scala.math.Ordering[B])Repr

Как лучше всего узнать, есть ли у метода неявные параметры (в scala 2.10-M4+)?


person Sagie Davidovich    schedule 06.08.2012    source источник


Ответы (2)


Прямо сейчас, я не думаю, что вы можете. isImplicit был добавлен 6 дней назад, так что вы сможете сделать это с помощью ночной сборки или в следующий этапный выпуск.

person Paul Butcher    schedule 06.08.2012

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

scala> val sortMethod = typeOf[::[_]].member(newTermName("sorted")).asMethod
sortMethod: reflect.runtime.universe.MethodSymbol = method sorted

scala> sortMethod.params // `params` has been added only a few days ago
res0: List[List[reflect.runtime.universe.Symbol]] = List(List(value ord))

scala> sortMethod.params(0)(0).asTerm.isImplicit
res2: Boolean = true

scala> sortMethod.params(0)(0) hasFlag Flag.IMPLICIT
res3: Boolean = true

Если вы спросите меня, какой способ предпочесть, я бы посоветовал использовать isXXX метода. Во-первых, это последовательный способ тестирования, потому что общедоступных флагов всего дюжина или около того, но есть гораздо больше вещей для тестирования (например, isStable или isSynthetic). Во-вторых, флаги сложнее, чем кажутся (например, несколько имен флагов могут соответствовать одному и тому же биту в маске флагов), поэтому методы isXXX обеспечивают лучшую инкапсуляцию.

person Eugene Burmako    schedule 06.08.2012