对于非重载和重载方法,Scala如何解析"Magnet Pattern"的隐式转换有很大差异.
假设存在如下实现的特征Apply("磁体模式"的变体).
trait Apply[A] {
def apply(): A
}
object Apply {
implicit def fromLazyVal[A](v: => A): Apply[A] = new Apply[A] {
def apply(): A = v
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们创建一个Foo具有单个apply实例的特征,Apply因此我们可以将任意类型的值传递给它,A因为存在隐式转换A => Apply[A].
trait Foo[A] {
def apply(a: Apply[A]): A = a()
}
Run Code Online (Sandbox Code Playgroud)
我们可以确保它使用REPL按预期工作,并使用此解决方法来减少Scala代码.
scala> val foo = new Foo[String]{}
foo: Foo[String] = $anon$1@3a248e6a
scala> showCode(reify { foo { "foo" } }.tree)
res9: String =
$line21$read.foo.apply( …Run Code Online (Sandbox Code Playgroud)