In Java, Scala oder allgemein jeder JVM-Sprache gibt es eine Reihe von Paketen, die standardmäßig importiert werden. Java importiert zum Beispiel automatisch java.lang
, Sie müssen es nicht in Ihrer Java-Code-Datei machen.
Nun weiß ich nicht, welche Komponente genau das erledigt (der Compiler? die JVM?), aber gibt es eine Möglichkeit, zusätzliche Pakete oder sogar Klassen standardmäßig zu importieren?
Nehmen wir an, Sie haben ein Paket, das eine Reihe von Hilfsfunktionen definiert, die Sie in Ihrem Projekt verwenden (ein Beispiel könnte scala.math
in Scala sein). Es wäre großartig, wenn Sie den Import dafür in jeder Mathematik-Klasse überspringen könnten .
Scala hat ab Version 2.8 Paketobjekte , deren Inhalt automatisch in jede Datei des Pakets importiert wird. Erstellen Sie eine Datei namens package.scala im obersten Verzeichnis Ihres Pakets (z. B. x/y/z/mypackage
), und fügen Sie sie in das Verzeichnis
Dann wird jede Definition innerhalb des Paketobjekts automatisch in jede Datei in Paket x.y.z.mypackage
importiert (d. h. keine Importanweisung wird benötigt)Sie können sich die Scala-Quellen anschauen - tun Sie einen Fund-dir -name package.scala - es gibt eine Reihe von ihnen, die obersten die impliziten Importe für das Scala-Paket selbst definieren, die automatisch in alle importiert werden Scala-Quelldatei.
Jim Balter erwähnt in seine Antwort (gehe upvote) die Scala 2.8 Paketobjekt .
Jede Art von Definition, die Sie in eine Klasse einfügen können, können Sie auch auf die oberste Ebene eines Pakets setzen. Wenn Sie eine Hilfsmethode haben, die Sie für ein ganzes Paket verwenden möchten, gehen Sie vor und fügen Sie es auf der obersten Ebene des Pakets ein.
Legen Sie dazu die Definitionen in ein Paketobjekt. Jedes Paket darf ein Paketobjekt haben
Scala hat eigentlich sein eigenes scala-Paketobjekt .
Siehe " Wo Paketobjekte abgelegt werden ".
So kann das Paketobjekt das Problem des expliziten Imports für ein bestimmtes Paket, aber nicht für ein Paket lösen.
Zu den aktuellen Einschränkungen gehören :
- Erstens können Sie überladene Methoden in Paketobjekten nicht definieren oder erben.
- Zweitens können Sie kein Mitglied in einem Paketobjekt definieren oder erben, das auch der Name einer Klasse oder eines Objekts auf oberster Ebene in demselben Paket ist.
Wir erwarten, dass einige zukünftige Scala-Releases diese Einschränkungen fallen lassen.
Ursprüngliche Antwort:
Auf der Scala-Seite gibt es eine Frage wie " sollte Scala scala.collection.JavaConversions._ standardmäßig importieren? " zeigt, dass Sie nicht einfach Standardimporte als Scala-Benutzer hinzufügen können.
Es muss von der Sprache unterstützt werden.
Übrigens war die Schlussfolgerung:
Aus der Perspektive eines Scala-Experten: Lassen Sie uns die Dinge einfach halten und die implizit importierten Implikationen auf das absolute Minimum beschränken.
Heiko Seeberger
Raphael kommentiert jedoch:
Ich denke, Sie könnten Ihr eigenes Compiler-Plugin schreiben, um einige Pakete hinzuzufügen?
Und tatsächlich, dieser Scala Artikel beschreibt, wie man den Scala Compiler erweitert .
Aber die wichtigsten Ergänzungen sind:
- Sie können dem Compiler eine Phase hinzufügen, wodurch zusätzliche Prüfungen oder zusätzliche Baumumschreibungen hinzugefügt werden, die nach Beendigung der Typprüfung angewendet werden.
- Sie können dem Compiler mitteilen, dass er Informationen über eine Annotation prüft, die auf Typen angewendet werden soll.
Ich bin also selbst bei einer Neuschreibung (einschließlich zusätzlicher Importe) nicht sicher, ob das Neuschreiben rechtzeitig erfolgt, damit die Typen und Funktionen (die von den impliziten Importen referenziert werden) korrekt analysiert werden können Aber vielleicht hat die Scala Compiler Corner mehr Ideen dazu.
Der Standardimport aller Klassen von java.lang
wird in Java-Sprachspezifikation (7.5.5)
Alle anderen Klassen müssen mit der import-Anweisung importiert werden.
Tags und Links scala java jvm-languages