13.2. Umieszczanie w kodzie klauzul importu
Klauzule importu nie muszą znajdować się na początku pliku źródłowego. Można je umieszczać również w innych miejscach, na przykład w definicjach klas lub metod. Skutki działania klauzuli importu umieszczonej w bloku kodu obowiązują od tej klauzuli do końca bloku, w którym została umieszczona. Na przykład, jeśli umieścimy instrukcję import wewnątrz bloku definiującego ciało metody, to nie będzie ona obowiązywała na zewnątrz definicji tej metody.
W pliku ImportedGreeting1.scala klauzule importu znajdują się na
początku metody main (wiersz
), w bloku kodu wyrażenia if (wiersz
), a nawet w klauzulach case wyrażenia match (wiersze
i
).
Plik ImportedGreeting1.scala: package greetings { package object hello { def greet = println("Hello!") } package object hi { def greet = println("Hi!") } package object welcome { def greet = println("Welcome!") } } object ImportedGreeting1 { def main(args: Array[String]) { import greetings._
if (args.length == 0) { import welcome._
greet } else args(0) match { case "Peter" => import hello._
greet case _ => import hi._
greet } } }
![]() | Wyrażenie match jest opisane w punkcie punkcie 14.1. |
Poniższe polecenia pokazują przykłady wykonania programu ImportedGreeting1.
$ scala ImportedGreeting1 Welcome! $ scala ImportedGreeting1 Peter Hello! $ scala ImportedGreeting1 Paul Hi!
Niejednoznaczność w odwoływaniu się do zaimportowanych składowych może spowodować błąd kompilacji.
Plik ImportedGreeting2.scala: package greetings1 { package object hello { def greet = println("Hello!") } } package greetings2 { package object hello { def greet = println("Hello!!") } } object ImportedGreeting2 { def main(args: Array[String]) { import greetings1.hello._ import greetings2.hello._ greet
} }
Program z pliku ImportedGreeting2.scala nie kompiluje się, gdyż
odwołanie do metody greet, w wierszu
, nie jest
jednoznaczne. Kompilator nie wie, czy to odwołanie ma dotyczyć metody
greetings1.hello.greet, czy greetings2.hello.greet.
$ scalac ImportedGreeting2.scala
ImportedGreeting2.scala:15: error: reference to greet is ambiguous;
it is imported twice in the same scope by
import greetings2.hello._
and import greetings1.hello._
greet
^
one error found
Plik ImportedGreeting1.scala:
package greetings {
package object hello {
def greet = println("Hello!")
}
package object hi {
def greet = println("Hi!")
}
package object welcome {
def greet = println("Welcome!")
}
}
object ImportedGreeting1 {
def main(args: Array[String]) {
import greetings._ 
