14

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

选项1

import com.somepackage

class MyClass {
  //further code
}

选项 2

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

2 回答 2

22

在 Scala 中,imports 是词法范围的。imported 标识符仅在它们被编辑的范围内可见import

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

您还可以将范围限制为import单个方法甚至单个块(!)

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

这是 Scala 规律性、正交性和简单性的一个很好的例子。例如,在 Java 中,块为局部变量创建作用域,但不为imports(或方法或其他任何东西)创建作用域。在 Scala 中,块创建范围。时期。没有例外,没有极端情况。

位于import花括号之间,因此它仅在花括号之间可见。它只是做你所期望的。

于 2013-06-10T23:27:41.187 回答
11

区别在于:

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

但是如果Option 2它只能在内部使用,MyClass而不能在外部使用,因为范围import仅限于内部MyClass

于 2013-06-10T17:56:08.170 回答