我的隐式如何被方法参数遮蔽?

时间:2014-04-04 23:12:32

标签: scala implicit-conversion scala-2.10

给出以下代码:

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)

1 个答案:

答案 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
}