Hinzufügen von Standardpaketimporten

7

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 .

    
pdinklag 17.02.2011, 07:44
quelle

4 Antworten

12

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

ein %Vor%

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 17.02.2011, 11:08
quelle
11

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.

    
VonC 17.02.2011 07:54
quelle
4

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.

    
Andreas_D 17.02.2011 08:14
quelle
1

In Java gibt es keinen Weg das zu tun.

    
TofuBeer 17.02.2011 07:47
quelle

Tags und Links