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. |
Plik Root1.scala:
package xml {
class Comment(comment: String) {
override def toString = "Comment: "+comment
}
}

