2017-04-23 4 views
1

Warum gibt die folgenden:Implizite Funktionen mit Symbol Argumente in Scala

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

während des folgenden nicht:

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

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

    () 
    } 
} 

Meines Wissen impliziter Funktionen werden automatisch durch den Compiler, wenn sie aufgerufen denkt, dass es eine gute Idee ist. Warum ruft der Compiler in beiden Fällen implPrint() nicht auf? Was übersehe ich hier?

Antwort

1

Implicits werden vom Compiler berücksichtigt, wenn er die Syntax des vorliegenden Codes nicht verstehen kann. In Ihrem ersten Beispiel versuchen Sie, pr() auf einem Symbol-Objekt aufzurufen, eine Syntax, die vom Compiler nicht verstanden wird, also wendet es sich an implicits. In Ihrem zweiten Beispiel deklarieren Sie ein Symbol und tun nichts damit, eine Syntax, die mit dem Parsing des Compilers übereinstimmt, so dass es nicht implicits betrachtet.

2

Implizite Methoden werden nur aufgerufen, wenn sie benötigt werden, oder es treten viele unerwartete Verhaltensweisen auf. Und hier rufen Sie die Methode nicht auf, die nicht darin enthalten ist, oder wenn sie an eine Methode übergeben wird, die andere Arten von Variablen benötigt, wird 'implPrint' nicht aufgerufen.