给出以下代码:
case class W(s:String)
object W{
implicit lazy val w=W("w")
}
trait A{
implicit def a:W=W("a")
}
object B{
def implicitUser(implicit w:W)=println(w.toString)
}
object Auser extends A{
def testa(a:String="0")=B.implicitUser
def testb(b:String="0")=B.implicitUser
}
如何解释repl的以下输出
scala>Auser.testa()
W(w)
scala>Auser.testb()
W(a)
看起来testa中的方法参数名称会阻止隐式名为a的解析。 (scala 2.10.3)
答案 0 :(得分:2)
除了隐含之外,Implicits只是标识符。
这意味着您可以使用另一个具有相同名称的标识符来遮蔽它们。
def foo(i: String) {
for (i <- 0 to 3) { println(i) } // Outer i is hidden
}
def foo(implicit i: String) {
for (i <- 0 to 3) { println(i) } // Outer i is still hidden
}
def bar(implicit i: String) { println("Bar "+i) }
def foo(implicit i: String) { bar } // Works
def foo(implicit i: String) {
for (i <- 0 to 3) bar // Doesn't
}