web-dev-qa-db-ja.com

importステートメントの "show"と "as"の違いは何ですか?

Importステートメントのshowasの違いは何ですか?

たとえば、違いは何ですか

import 'Dart:convert' show JSON;

そして

import 'package:google_maps/google_maps.Dart' as GoogleMap;

いつshowを使用し、いつasを使用する必要がありますか?

show GoogleMapに切り替えると、GoogleMap(たとえば、GoogleMap.LatLng)オブジェクトへのすべての参照が未定義として報告されます。

50
nick

asshowは2つの異なる概念です。

asを使用すると、インポートしたライブラリに名前を付けることができます。これは通常、ライブラリに多数のグローバル関数がある場合に、ネームスペースを汚染しないようにするために行われます。 asを使用する場合、上記のライブラリのすべての関数とクラスに、例で行った方法でアクセスすることでアクセスできます:GoogleMap.LatLng

show(およびhide)を使用すると、アプリケーションで表示する特定のクラスを選択できます。あなたの例では次のようになります:

import 'package:google_maps/google_maps.Dart' show LatLng;

これにより、LatLngにアクセスできるようになりますが、そのライブラリからは他に何もアクセスできません。これの反対は:

import 'package:google_maps/google_maps.Dart' hide LatLng;

これにより、LatLng以外のライブラリからすべてにアクセスできるようになります。

同じ名前の複数のクラスを使用する場合は、asを使用する必要があります。また、両方のアプローチを組み合わせることができます。

import 'package:google_maps/google_maps.Dart' as GoogleMap show LatLng;
68
Dennis Kaselow

showケース:

import 'Dart:async' show Stream;

この方法では、Dart:asyncからStreamクラスのみをインポートするため、Stream以外のDart:asyncから別のクラスを使用しようとすると、エラーがスローされます。

void main() {
  List data = [1, 2, 3];
  Stream stream = new Stream.fromIterable(data); // doable
  StreamController controller = new StreamController(); // not doable
                                                        // because you only show Stream
}

asケース:

import 'Dart:async' as async;

このようにして、Dart:asyncからすべてのクラスをインポートし、asyncキーワードで名前空間を設定します。

void main() {
  async.StreamController controller = new async.StreamController(); // doable
  List data = [1, 2, 3];
  Stream stream = new Stream.fromIterable(data); // not doable
                                                 // because you namespaced it with 'async'
}

asは通常、インポートされたライブラリに競合するクラスがある場合に使用されます。たとえば、Streamという名前のクラスを含むライブラリ 'my_library.Dart'があり、Dart:asyncStreamクラスを使用したい場合、次のようになります。

import 'Dart:async';
import 'my_library.Dart';

void main() {
  Stream stream = new Stream.fromIterable([1, 2]);
}

このように、このStreamクラスが非同期ライブラリからのものか、独自のライブラリからのものかはわかりません。 asを使用する必要があります。

import 'Dart:async';
import 'my_library.Dart' as myLib;

void main() {
  Stream stream = new Stream.fromIterable([1, 2]); // from async
  myLib.Stream myCustomStream = new myLib.Stream(); // from your library
}

showの場合、これは特定のクラスのみが必要であることがわかっている場合に使用されると思います。インポートしたライブラリに競合するクラスがある場合にも使用できます。自分のライブラリにCustomStreamおよびStreamという名前のクラスがあり、Dart:asyncも使用したいとしますが、この場合は自分のライブラリのCustomStreamのみが必要です。

import 'Dart:async';
import 'my_library.Dart';

void main() {
  Stream stream = new Stream.fromIterable([1, 2]); // not doable
                                                   // we don't know whether Stream 
                                                   // is from async lib ir your own
  CustomStream customStream = new CustomStream();// doable
}

いくつかの回避策:

import 'Dart:async';
import 'my_library.Dart' show CustomStream;

void main() {
  Stream stream = new Stream.fromIterable([1, 2]); // doable, since we only import Stream
                                                   // async lib
  CustomStream customStream = new CustomStream();// doable
}
11
Faris Nasution