13.1. Używanie klauzul importu
Klauzule importu pozwalają odwoływać się do zaimportowanych elementów
bez konieczności podawania ich pełnych nazw. W pliku Imports1.scala
znajdują się klauzule importu, które importują klasę Color z pakietu
java.awt (wiersz
), klasę i obiekt Random z pakietu scala.util
(wiersz
), metodę parseDouble z klasy java.lang.Double (wiersz
), metodę log10 z pakietu scala.math (wiersz
) oraz wartość
EOL z obiektu scala.compat.Platform (wiersz
).
Plik Imports1.scala: import java.awt.Color
import scala.util.Random
import java.lang.Double.parseDouble
import scala.math.log10
import scala.compat.Platform.EOL
![]()
Do zaimportowanych elementów można się odwoływać bez konieczności podawania ich pełnych nazw.
scala> :load Imports1.scala Loading Imports1.scala... import java.awt.Color import scala.util.Random import java.lang.Double.parseDouble import scala.math.log10 import scala.compat.Platform.EOL scala> Color.BLACK res0: java.awt.Color = java.awt.Color[r=0,g=0,b=0] scala> new Color(0,0,0) res1: java.awt.Color = java.awt.Color[r=0,g=0,b=0] scala> new Random() res2: scala.util.Random = scala.util.Random@1cb4004 scala> scala.util.Random.setSeed(1L)
scala> Random.alphanumeric
res4: scala.collection.immutable.Stream[Char] = Stream(N, ?)
scala> parseDouble("2.3")
res5: Double = 2.3
scala> log10(2)
res6: Double = 0.3010299956639812
scala> EOL.length
res7: Int = 2
Klauzula importu może zawierać listę zawierającą wiele elementów oddzielonych przecinkami. Taka klauzula jest równoważna osobnym klauzulom importu zawierającym po jednym elemencie z listy.
Plik Imports2.scala: import java.awt.Color, java.lang.Double.parseDouble, scala.util.Random, scala.math.log10, scala.compat.Platform.EOL
W pliku Imports2.scala znajduje się klauzula importu funkcjonalnie równoważna klauzulom z pliku Imports1.scala.
scala> :load Imports2.scala Loading Imports2.scala... import java.awt.Color import java.lang.Double.parseDouble import scala.util.Random import scala.math.log10 import scala.compat.Platform.EOL
Poniższy przykład ilustruje możliwość importowania składowych obiektu
będącego instancją pewnej klasy. Klauzula importu z wiersza
importuje metodę greet obiektu wskazywanego przez world.
scala> class Hello(arg: String) { def greet = println("hello "+arg) }
defined class Hello
scala> val world = new Hello("world!")
world: Hello = Hello@aca26f
scala> import world.greet
import world.greet
scala> greet
hello world!
W klauzuli importu można, za pomocą symbolu _, zaimportować
wszystkie importowalne składowe. Klauzula importu z wiersza
importuje składowe pakietu java.awt.
scala> import java.awt._import java.awt._ scala> new Point(1,2) res9: java.awt.Point = java.awt.Point[x=1,y=2] scala> Color.BLUE res10: java.awt.Color = java.awt.Color[r=0,g=0,b=255]
Za pomocą jednej klauzuli importu można, przy użyciu nawiasów
klamrowych, zaimportować więcej niż jedną składową. Klauzula importu z
wiersza
importuje składowe Queue i Stack z pakietu
scala.collection.mutable.
scala> import scala.collection.mutable.{Queue, Stack}
import scala.collection.mutable.{Queue, Stack}
scala> Queue(1,2)
res11: scala.collection.mutable.Queue[Int] = Queue(1, 2)
scala> Stack('a,'b,'c)
res12: scala.collection.mutable.Stack[Symbol] = Stack('a, 'b, 'c)
Za pomocą podwójnej strzałki w prawo (znaki => lub znak ⇒) można importowanym składowym nadawać inne nazwy.
Plik Imports3.scala: import scala.math.BigDecimal, java.math.{BigDecimal => JBigDecimal}
Klauzula importu z pliku Imports3.scala powoduje zaimportowanie z pakietu scala.math klasy i obiektu BigDecimal oraz klasy BigDecimal z pakietu java.math, przy czym ta druga klasa zostaje zaimportowana pod nazwą JBigDecimal.
scala> :load Imports3.scala
Loading Imports3.scala...
import scala.math.BigDecimal
import java.math.{BigDecimal=>JBigDecimal}
scala> BigDecimal(123)
res13: scala.math.BigDecimal = 123
scala> new JBigDecimal("123")
res14: java.math.BigDecimal = 123
Nazwą nadaną importowanemu elementowi może być _, co powoduje ukrycie takiego elementu. W klauzuli importu ostatnim elementem w nawiasach klamrowych może być znak _, co powoduje zaimportowanie wszystkich importowalnych składowych, z pominięciem składowych, których nazwy zostały użyte we wcześniejszych elementach listy w nawiasach klamrowych.
Plik Imports4.scala: import scala.xml.{Text => _, ProcInstr => EntityRef, _}
Klauzula importu z pliku Imports4.scala powoduje zaimportowanie składowych pakietu scala.xml, przy czym składowa Text zostaje ukryta, a składowa ProcInstr zostaje zaimportowana pod nazwą EntityRef. W pakiecie scala.xml znajduje się klasa o nazwie EntityRef. Ta klasa nie zostaje zaimportowana.
scala> :load Imports4.scala
Loading Imports4.scala...
import scala.xml.{Text=>_, ProcInstr=>EntityRef, _}
scala> Comment("a comment")
res15: scala.xml.Comment = <!--a comment-->
scala> Text("hello")
<console>:33: error: not found: value Text
Text("hello")
^
scala> scala.xml.Text("hi")
res17: scala.xml.Text = hi
scala> ProcInstr("a","b")
<console>:33: error: not found: value ProcInstr
ProcInstr("a","b")
^
scala> EntityRef("amp")
<console>:33: error: not enough arguments for method apply: (target: String, proctext: String)scala.xml.ProcInstr in object ProcInstr.
Unspecified value parameter proctext.
EntityRef("amp")
^
scala> EntityRef("c","d")
res20: scala.xml.ProcInstr = <?c d?>
scala> scala.xml.ProcInstr("c","d")
res21: scala.xml.ProcInstr = <?c d?>
scala> scala.xml.EntityRef("amp")
res22: scala.xml.EntityRef = &
Wyrażenie z wiersza
powoduje błąd, gdyż nazwa ProcInstr nie jest
zaimportowana. Wyrażenie z wiersza
powoduje błąd, gdyż pod nazwą
EntityRef kryje się ProcInstr z pakietu scala.xml, a metoda
apply tego obiektu wymaga dwóch argumentów, a nie
jednego. Prawidłowe utworzenie obiektu klasy scala.xml.ProcInstr
powodują wyrażenia z wierszy
oraz
.
Zaimportowane nazwy mogą być używane w kolejnych klauzulach importu.
Plik Imports5.scala: import scala.collection._, mutable.Map import immutable.Set
Instrukcje z pliku Imports5.scala importują składowe pakietu scala.collection oraz składowe Map z pakietu scala.collection.mutable i Set z pakietu scala.collection.immutable.
scala> :load Imports5.scala Loading Imports5.scala... import scala.collection._ import mutable.Map import immutable.Set scala> Map() res23: scala.collection.mutable.Map[Nothing,Nothing] = Map() scala> Set() res24: scala.collection.immutable.Set[Nothing] = Set()
![]() | Specyfikacja języka Scala opisuje klauzule importu w punkcie 4.7. |
Plik Imports1.scala:
import java.awt.Color 
