2014-04-04 53 views
2

考慮下面的代碼:我的隱式如何被方法參數遮蔽?

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) 

它看起來像在種皮的方法參數名稱下面的輸出防止隱性命名爲的分辨率。 (斯卡拉2.10.3)

+2

這聽起來是對的 - 隱含def a被參數掩蓋,所以它不存在隱式分辨率。 – AmigoNico

+0

令人驚訝,因爲類型不匹配... – Jean

回答

2

除了隱含之外,隱含的只是標識符。

這意味着您可以使用具有相同名稱的其他標識符對它們進行遮蔽。

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 
}