Scala оператор импорта вверху и внутри класса Scala

В scala какая разница между этими двумя стратегиями импорта

Вариант 1

import com.somepackage

class MyClass {
  //further code
}

Вариант 2

class MyClass {
  import com.somepackage
  //further code
}

Ответы

Ответ 1

В Scala, import лексически ограничены. Идентификаторы import ed видны только в области, в которой они были import ed.

В первом случае область - это файл, поэтому import будет отображаться во всем файле, но не в других файлах. Во втором случае область видимости - это класс, поэтому import будет отображаться во всем классе, но не в других классах даже в одном файле (кроме классов курса, вложенных в MyClass).

Вы также можете ограничить область import только одним методом даже одним блоком (!)

class Foo {
  def bar {
    // do something
    {
      import baz.quux.Frotz
      // use Frotz
    }
    // Frotz not visible here
  }
}

Это хороший пример Scala регулярности, ортогональности и простоты. Например. в Java блоки создают области для локальных переменных, но не для import (или методов или чего-либо еще). В Scala блоки создают области. Период. Никаких исключений, никаких угловых случаев.

import находится между фигурными фигурными скобками, ergo видна только между фигурными фигурными скобками. Он просто делает то, что вы ожидаете.

Ответ 2

Разница заключается в следующем:

В Option 1 импорт является жизнеспособным для полной области. т.е. любой класс/признак/функция в com.somePackage можно использовать где угодно внутри/вне MyClass

Но в случае Option 2 он может использоваться только внутри MyClass, а не вне его, потому что область действия import ограничена только внутри MyClass.