Scala类顶部和内部的Scala导入语句

Kal*_*her 13 scala

在scala中,这两种导入策略有什么区别

选项1

import com.somepackage

class MyClass {
  //further code
}
Run Code Online (Sandbox Code Playgroud)

选项2

class MyClass {
  import com.somepackage
  //further code
}
Run Code Online (Sandbox Code Playgroud)

Jör*_*tag 18

在Scala中,imports是词法范围的.imported标识符仅在其import编入的范围内可见.

在第一种情况下,范围是文件,因此,imports将在整个文件中可见,但在其他文件中不可见.在第二种情况下,范围是类,因此imports将在整个类中可见,但在其他类中甚至不在同一文件中(嵌套在其中的课程类除外MyClass).

您也可以将importjust 的范围限制为单个方法甚至单个块(!)

class Foo {
  def bar {
    // do something
    {
      import baz.quux.Frotz
      // use Frotz
    }
    // Frotz not visible here
  }
}
Run Code Online (Sandbox Code Playgroud)

这是Scala规则性,正交性和简单性的一个很好的例子.例如,在Java中,块为局部变量创建范围,但不为imports(或方法或其他任何东西)创建范围.在Scala中,块创建范围.期.没有例外,没有角落案例.

import位于花括号之间,只有在花括号之间才可见.它只是做你期望的.


Jat*_*tin 11

不同之处是:

Option 1导入是可行的完整范围.即任何类/特征/功能都com.somePackage可以在任何内部/外部使用MyClass

但是在Option 2它的情况下它只能在内部MyClass而不是外部使用,因为范围import仅限于内部MyClass.