Was sind Paketobjekte, nicht so sehr das Konzept, sondern ihre Verwendung?
Ich habe versucht, ein Beispiel zum Laufen zu bringen, und das einzige Formular, das ich zur Arbeit bekam, war wie folgt:
package object investigations {
val PackageObjectVal = "A package object val"
}
package investigations {
object PackageObjectTest {
def main(args: Array[String]) {
println("Referencing a package object val: " + PackageObjectVal)
}
}
}
Beobachtungen, die ich bisher gemacht habe, sind:
package object _root_ { ... }
ist nicht erlaubt (was vernünftig ist),
package object x.y { ... }
ist auch nicht erlaubt.
Es scheint, dass ein Paketobjekt im unmittelbaren übergeordneten Paket deklariert werden muss und, falls wie oben beschrieben, das durch Klammern getrennte Paketdeklarationsformular erforderlich ist.
Sind sie gebräuchlich? Wenn das so ist, wie?
Antworten:
Normalerweise würden Sie Ihr Paketobjekt in einer separaten Datei ablegen, die
package.scala
in dem Paket aufgerufen wird , dem es entspricht. Sie können auch die verschachtelte Paketsyntax verwenden, dies ist jedoch recht ungewöhnlich.Der Hauptanwendungsfall für Paketobjekte besteht darin, dass Sie Definitionen an verschiedenen Stellen innerhalb Ihres Pakets sowie außerhalb des Pakets benötigen, wenn Sie die vom Paket definierte API verwenden. Hier ist ein Beispiel:
Jetzt sind die Definitionen in diesem Paketobjekt im gesamten Paket verfügbar
foo.bar
. Außerdem werden die Definitionen importiert, wenn jemand außerhalb dieses Pakets importiertfoo.bar._
.Auf diese Weise können Sie verhindern, dass der API-Client zusätzliche Importe ausgibt, um Ihre Bibliothek effektiv zu nutzen - z. B. in Scala-Swing müssen Sie schreiben
all die Güte wie
onEDT
und implizite Umwandlungen vonTuple2
zu habenDimension
.quelle
org
oder dascom
Paket der obersten Ebene mit Ihrem Paketobjekt verschmutzen müssen, wenn Sie möchten, dass es zu Ihrem eigenen Stammpaket gehört, zorg.foo
. Ich finde, dass es etwas besser gewesen wäre, die Definition direkt unter dem Paket zu haben, zu dem sie gehören sollte.Während Moritz 'Antwort genau richtig ist, ist eine zusätzliche Sache zu beachten, dass Paketobjekte Objekte sind. Dies bedeutet unter anderem, dass Sie sie mithilfe der Mix-In-Vererbung aus Merkmalen aufbauen können. Moritz 'Beispiel könnte geschrieben werden als
Hier ist die Versionierung ein abstraktes Merkmal, das besagt, dass das Paketobjekt eine "Versions" -Methode haben muss, während JodaAliases und JavaAliases konkrete Merkmale sind, die handliche Typ-Aliase enthalten. Alle diese Eigenschaften können von vielen verschiedenen Paketobjekten wiederverwendet werden.
quelle
Sie könnten es schlimmer machen, als direkt zur Quelle zu gehen. :) :)
https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/library/scala/package.scala
https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/library/scala/collection/immutable/package.scala
quelle
Nicht so bei Scala 3 , das Mitte 2020 auf Basis von Dotty veröffentlicht werden soll , wie hier :
quelle