Spray のマグネットがいかに簡単に機能するかははっきりと理解できますが、FieldDefMagnet のすべての変換と暗黙の機能は私の頭を吹き飛ばすだけです。ソースの一部は次のとおりです。
def formField(fdm: FieldDefMagnet): fdm.Out = fdm()
trait FieldDefMagnet {
type Out
def apply(): Out
}
object FieldDefMagnet {
implicit def apply[T](value: T)(implicit fdm2: FieldDefMagnet2[T]) = new FieldDefMagnet {
type Out = fdm2.Out
def apply() = fdm2(value)
}
}
trait FieldDefMagnet2[T] {
type Out
def apply(value: T): Out
}
object FieldDefMagnet2 {
implicit def apply[A, B](implicit fdma: FieldDefMagnetAux[A, B]) = new FieldDefMagnet2[A] {
type Out = B
def apply(value: A) = fdma(value)
}
}
trait FieldDefMagnetAux[A, B] extends (A ⇒ B)
たとえば、私が呼び出すと、formField("name")
scalac は でラップ"name"
しますFieldDefMagnet.apply("name")
が、他の暗黙的なものはどのように選択され、適用されますか?