【 Flutter 】Flutter を 基礎 から 学習 ( Dart編 ) part26 ライブラリと可視性

基礎 から 学ぶ Flutter 」という書籍で  学習 したことを ブログでアウトプットしていこうと思います。今回は Dart編 ( part26 )です。

前回

【 Flutter 】Flutter を 基礎 から 学習 ( Dart編 ) part25 ライブラリと可視性

今回もライブラリと可視性の学習です。

ライブラリと可視性

ライブラリプレフィックスの指定

ライブラリを複数importした際、クラス名が衝突(同じクラス名)することがあります。

エラーパターン

testA/test.dart

String hoge() {
   return 'testAフォルダのhoge!';
}

testB/test.dart

String hoge() {
   return 'testBフォルダのhoge!';
}

main.dart

import 'testA/test.dart';
import 'testB/test.dart';

void main() {
  print('Hello Dart! ' + hoge());
}

これだと以下のようなエラーになります。

main.dart:5:26: Error: 'hoge' is imported from both 'testA/test.dart' and 'testB/test.dart'.
  print('Hello Dart! ' + hoge());

正常パターン

これを防ぐためにプレフィックスを指定できます。

import文の末にasを記述し、続けて任意の名前を指定します。
使用する際は「プレフィックス名.関数(もしくはクラス」とします。

main.dart

import 'testA/test.dart';
import 'testB/test.dart' as testB;

void main() {
  print('Hello Dart! ' + testB.hoge());
}

正常に実行できました。

Hello Dart! testBフォルダのhoge!

testA/test.dartのhoge()は?

では「testA/test.dart」のhoge()は呼び出せないのでしょうか?
そんなことはないようです。
今回、「testB/test.dart」にプレフィックスを指定したので単純な「hoge()」関数は「testA/test.dart」のみとなりました。
だから・・・なのか、以下のように実装すると「testA/test.dart」のhoge()を呼び出せます。

main.dart

import 'testA/test.dart';
import 'testB/test.dart' as testB;

void main() {
  print('Hello Dart! ' + hoge()); // ★testA/test.dartのhoge()
}

最後に

ライブラリのプレフィックスについて学習しました。
識別子の衝突はどの言語でも発生します。
名前空間みたいなものはないのでしょうかね?

今日はここまで!