14

scalaでは、これら2つのインポート戦略の違いは何ですか?

オプション1

import com.somepackage

class MyClass {
  //further code
}

オプション 2

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

2 に答える 2

22

Scala では、imports はレキシカル スコープです。imported 識別子は、それらが ed されたスコープ内でのみ表示さimportれます。

最初のケースでは、スコープはファイルであるため、imports はファイル全体で表示されますが、他のファイルでは表示されません。2 番目のケースでは、スコープはクラスであるため、 s はクラス全体で表示されますが、同じファイル内であってもimport他のクラスでは表示されません(もちろん、 内にネストされたクラスを除く)。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、内部でのみ使用でき、外部では使用できません。MyClassimportMyClass

于 2013-06-10T17:56:08.170 に答える