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.

Język programowania Scala Wydanie 2. Copyright © Grzegorz Balcerek 2016

Licencja Creative Commons

Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowe.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.