2012年3月6日火曜日

Dartのライブラリとスクリプト

このエントリーをはてなブックマークに追加
Dartではライブラリという単位で構成を管理します。ライブラリ単位でスクリプトにインポートしたり、ライブラリ単位で名前空間を分けたりします。クラスや変数をプライベートにすることで外部から見えなくなりますが、その単位がライブラリでもあります。

ライブラリはファイルの先頭に #library ディレクティブを指定して作成します。

mylib.dart
#library('my_greeting_lib');
class Greeting {
  void hello(String name) => print('Hello, ${name}!');
}
作成したライブラリは別のコードから #import ディレクティブを使ってインポートし、使用します。
#import('mylib.dart');
main() {
  Greeting g = new Greeting();
  g.hello('world'); // Hello, world!
}
ただしこのままですと、複数のライブラリで同じ名前のクラスが定義されていたときに混乱してしまいます。そこでライブラリをインポートするときにはプレフィックス(接頭子)を指定できます。mylib.dart以外のライブラリをインポートするときに別のプレフィックスを指定すれば、そのライブラリが別のGreetingクラスを定義していたとしても、混乱せずに使い分けることができます。
#import('mylib.dart', prefix:'mylib');
main() {
  mylib.Greeting g = new mylib.Greeting();
  g.hello('world'); // Hello, world!
}
ライブラリとしてではなく、コードの一部として別のファイルを取り込むには、#source ディレクティブを使用します。ライブラリとして取り込むと取り込んだ側のコードのスコープから見えるようになるだけですが、ソースとして取り込むと取り込んだ側のコードの一部として扱われ、プライベートとして指定していないと取り込んだライブラリの外にも公開されます。

mysource.dart
class MySouce {}
mynestedlib.dart
#library('my_nested_lib');
class MyNestedLib {}
mylib.dart
#library('my_lib');
#import('mynestedlib.dart');
#source('mysource.dart');
class Greeting {
  void hello() {
    new MySource(); // OK
    new MyNestedLib(); // OK
  }
}
#import('mylib.dart', prefix:'mylib');
main() {
  new mylib.Greeting.hello(); // OK
  new mylib.MySource(); // OK
  new mylib.MyNestedLib(); // NG
}
なお、ライブラリの中でもトップレベルのmain関数を含むものをスクリプトと呼びます。


こちらもどうぞ

0 件のコメント:

コメントを投稿