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 = &amp;

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.

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.