2012-10-19 7 views
7

Auf normalen Objekten kann ich folgendes tun:Warum kann apply() nicht in Kurzform für Paketobjekte verwendet werden?

object A { 
    def apply = "!" 
} 
A() // "!" 

Aber auf Paketobjekte, das nicht funktioniert:

package object A { 
    def apply = "?" 
} 
A.apply // "?" 
A() // compile error 
    // error: package A is not a value 

Gibt es eine grundlegende Einschränkung? Oder ist es nur eine Implementationsbeschränkung, die ich beheben kann, indem ich den Compiler etwas tweeze?

+0

Was wollten Sie damit machen? Warum nicht einfach normale Objekte benutzen? –

+1

@SergeyPassichenko - zum Beispiel, um eine Methode ohne Importe in der Codebasis aufzurufen - wenn Sie das Paketobjekt "Affe" mit der Methode "Anwenden" haben, dann könnten Sie "affe()" an jedem beliebigen Ort ausführen. Das ist ein Beispiel - aber ich bin auch daran interessiert, warum Paketobjekte sich so von normalen Objekten unterscheiden. – Rogach

Antwort

7

Die einzige Möglichkeit, es gelten tun können, ohne, ist dies:

A.`package`() 

Dies liegt daran, A keinen Wert oder eine Methode, und die Sprachspezifikation Zustände bezeichnen, dass für f() gültig zu sein, f hat einen Methodentyp oder einen Werttyp mit einer apply Methode zu haben. Ich habe keine Ahnung, wie leicht man den Compiler "zwicken" könnte, um dies zu ändern, aber ich bezweifle, dass es sich lohnt. Wenn Sie zu solchen Längen gehen möchten, wäre es einfacher, Ihre Methode Predef hinzuzufügen.

+0

Wie kann ich 'Predef' eine Methode hinzufügen? – Madoc

+0

@Madoc: Sie erhalten den Quellcode der Standardbibliothek, fügen Ihre Methode hinzu und kompilieren sie –

Verwandte Themen