我知道大小写类,模式匹配,unapply和PartialFunction,但我对下面的宏片段感到困惑。
val declarations = weakTypeOf[T].declarations
val methods = declarations.collect { case m: MethodSymbol => m }
Scaladoc of MemberScopehttp://www.scala-lang.org/api/2.10.4/scala.reflect.api.Scopes美元MemberScope
Collect方法接受PartialFunction[Universe.Symbol, B]
我找不到MethodSymbol
的unapply
方法,它也是一个trait而不是case类,所以在witch代码编译器中转换
{ case m: MethodSymbol => m }
由于MethodSymbol
不是泛型类型,所以匹配
case m: MethodSymbol => m
本质上等同于
case m if m.isInstanceOf[MethodSymbol] => m
这里绝对没有魔法,unapply
机制与这种匹配根本没有关系。同样的事情在Java中也很容易做到。