2017-04-23 173 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”。