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

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.