Я ясно понимаю, как работают легкие магниты в Spray, но все преобразования и импликации в FieldDefMagnet просто ударяют мои мозги. Вот часть из sources:Как работает FormFieldMagnet в спрей?
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")
, но как другие implicits выбраны и применены?
Главный момент, который я не понимаю, когда делает '' FieldDefMagnet2.apply' с FieldDefMagnetAux' неявное вызывается ? Когда мы вызываем 'fdm2 (value)', это явный вызов 'def apply (value: T): Out' в' trait FieldDefMagnet2 [T] ', и scalac не должен пытаться разрешить его с помощью convertion => look for 'implicit def apply [A, B] (неявная fdma: FieldDefMagnetAux [A, B])', поэтому, когда эта строка вызывается? –
Я отредактировал свой ответ, чтобы содержать полное расширение. Чтобы ответить на ваш конкретный вопрос: все эти неявные defs вызываются перед методом, требующим их экземпляра. Они не разрешаются как «неявное преобразование», а как «неявный параметр» (который является более мощной формой неявного использования). – jrudolph