2017-04-23 197 views
1

爲什麼下面的印刷符號參數隱函數:在斯卡拉

class TestClass{ 
    case class printClass(s: Symbol) { 
    def pr() = println(s); 
    } 
    implicit def implPrint(i: Symbol) = printClass(i) 
} 

object TestObject extends TestClass{ 
    def main(args:Array[String]) = { 
    'x pr 
    } 
} 

而下面沒有:

class TestClass{ 
    implicit def implPrint(i: Symbol) = println(i) 
} 

object TestObject extends TestClass{ 
    def main(args:Array[String]) = { 
    'x 

    () 
    } 
} 

據我所知,隱函數由如果編譯器自動調用認爲這是一個好主意。爲什麼編譯器在兩種情況下都不調用implPrint()?我在這裏忽略了什麼?

回答

1

編譯器在無法理解當前代碼的語法時會考慮隱含。在你的第一個例子中,你試圖在Symbol對象上調用pr(),這是編譯器無法理解的語法,所以它變成了implicits。在你的第二個例子中,你聲明瞭一個符號並且對它沒有做任何事情,語法與編譯器的解析一致,所以它沒有查看蘊含。

2

隱式方法僅在需要時纔會調用,否則會出現許多意外行爲。在這裏,你不要調用它不包含的方法,或者如果它傳遞給需要其他類型變量的方法,將不會調用「implPrint」。