13.3. Przedrostek _root_
Plik Root1.scala zawiera definicję klasy Comment w pakiecie xml.
Plik Root1.scala: package xml { class Comment(comment: String) { override def toString = "Comment: "+comment } }
W pakiecie scala.xml również znajduje się klasa o nazwie Comment. Wyrażenia z wierszy i , mimo że wyglądają tak samo, tworzą instancje dwóch różnych klas. Wyrażenie z wiersza tworzy instancję klasy xml.Comment. Wyrażenie z wiersza tworzy instancję klasy scala.xml.Comment, gdyż jest użyte po poleceniu import z wiersza . W wierszu użyty jest przedrostek _root_, za pomocą którego można poinformować kompilator, że chcemy odwołać się do szczytu hierarchii pakietów. Użycie przedrostka _root_ pozwala odwołać się do klasy xml.Comment z pliku Root1.scala, mimo że w wierszu zostało wykonane polecenie import scala.xml.
scala> new xml.Comment("no comments") res0: xml.Comment = Comment: no comments scala> import scala.xml import scala.xml scala> new xml.Comment("no comments") res1: scala.xml.Comment = <!--no comments--> scala> new _root_.xml.Comment("no comments") res2: xml.Comment = Comment: no comments
Plik Root2.scala zawiera kolejne przykłady użycia przedrostka _root_. W tym pliku zdefiniowany jest obiekt Root2, zawierający metody test1 i test2. Obie metody posiadają tak samo wyglądające wywołania metody println (w wierszach i ).
Plik Root2.scala: import scala._ object Root2 { def test1 { import xml._ println(new Comment("no comments")) println(new _root_.xml.Comment("no comments")) } def test2 { import _root_.xml._ println(new Comment("no comments")) println(new scala.xml.Comment("no comments")) } }
Mimo tego, rezultaty wywołań obu metod są różne (wiersze i ).
scala> Root2.test1 <!--no comments--> Comment: no comments scala> Root2.test2 Comment: no comments <!--no comments-->
Wyjaśnienie różnicy w działaniu kryje się w klauzulach importu. W wierszu importowane są składowe pakietu scala. Jednym z elementów tego pakietu jest pakiet o nazwie xml. W konsekwencji, w wierszu importowane są składowe pakietu scala.xml. Metoda println z wiersza odwołuje się wobec tego do klasy scala.xml.Comment, a nie do klasy xml.Comment z pliku Root1.scala. Odwołanie do klasy xml.Comment z pliku Root1.scala znajduje się w wierszu , w którym użyty jest przedrostek _root_. Klauzula importu (wiersz ) znajdująca się w metodzie test2 importuje składowe pakietu xml, ale tym razem z pliku Root1.scala. W celu odwołania się do tego właśnie pakietu, w klauzuli importu użyty został przedrostek _root_. W konsekwencji, metoda prinln z wiersza odwołuje się do klasy xml.Comment zdefiniowanej w tym pliku. Odwołanie do klasy scala.xml.Comment znajduje się w wierszu i w tym odwołaniu użyta jest pełna nazwa klasy. Użycie przedrostka _root_ w tym przypadku nie jest konieczne.
Specyfikacja języka Scala opisuje przedrostek _root_ w punkcie 9.4. |