私は、Spray がディレクティブ、特にパラメーター抽出 DSL をどのように実装したかについて頭を悩ませようとしています。
私は磁石のパターンを (かろうじて) 理解していますが、ParamDefMagnet と ParamDefMagnet2 がどのように連携するかについて行き詰まっています。
def parameter(pdm: ParamDefMagnet): pdm.Out = pdm()
trait ParamDefMagnet {
type Out
def apply(): Out
}
trait ParamDefMagnet2[T] {
type Out
def apply(value: T): Out
}
type ParamDefMagnetAux[A, B] = ParamDefMagnet2[A] { type Out = B }
def ParamDefMagnetAux[A, B](f: A ⇒ B) = new ParamDefMagnet2[A] { type Out = B; def apply(value: A) = f(value) }
以下の暗黙的なメソッドによって、ParamDefManget2 が暗黙的に ParamDefMagnet に変換される方法を理解しようとしています。
object ParamDefMagnet {
implicit def apply[T](value: T)(implicit pdm2: ParamDefMagnet2[T]) = new ParamDefMagnet {
type Out = pdm2.Out
def apply() = pdm2(value)
}
}
を呼び出すとparameter("name")
、「名前」はどのように暗黙的に に変換されParamDefMagnet
ますか? そして、それをParamDefMagnet2
最初に変換する場合、それvalue: T
をに変換するためにどこから来るのParamDefMagnet
ですか?