2012年5月30日水曜日

スクリプトの情報(引数など)を取得する

このエントリーをはてなブックマークに追加
Dartではdart:coreのOptionsを使うと、dartコマンドのパスや、スクリプトのパス、スクリプト起動時の引数を取得することができます。
void main() {
  Options opt = new Options();
  print("executable=${opt.executable}");
  print("script=${opt.script}");
  opt.arguments.forEach((e) => print("argument=$e"));
}
このコードをDart Editor上で実行してみましょう。スクリプトへの引数はManage LaunchesのウィンドウからScript arguments欄に設定することができます。

ここでは引数として「abc 123」と指定してみました。結果は次のようになります
executable=/home/dart-ing/Downloads/dart/dart-sdk/bin/dart
script=/home/dart-ing/dart/OptionsTest/OptionsTest.dart
argument=abc
argument=123

2012年5月22日火曜日

IntelliJ IDEAのDartプラグインを使ってみる

このエントリーをはてなブックマークに追加
JetBrainsが提供している統合開発環境のIntelliJ IDEA 11に、Dart用のプラグインがあります。以前から提供されていましたが、最近バージョンアップされたので使ってみました。

このプラグインはプラグインリポジトリに登録されていますので、IntelliJ IDEA上からインストールすることができます。リポジトリの一覧を開いて Dart で検索するとプラグインが見つかります。


プラグインをインストールすると、.dart ファイルをDartファイルとして認識します。


文法もある程度認識しており、途中まで入力したクラスやメソッドを補完することもできます。


今のところあまり機能は多くないため本格的な開発に使うというわけにはいきませんが、Dart Editor以外の選択肢として期待したいと思います。

2012年5月16日水曜日

Dartで例外を処理する

このエントリーをはてなブックマークに追加
Dartには例外処理の機能が備わっています。

例外を受け取る

発生した例外を受け取るには、try - catch を使います。サンプルコード
void main() {
  int a = 0;
  try {
    a.length;
  } catch (final NoSuchMethodException e) {
    print(e);
  }
}
このコードではint型の変数のlengthプロパティを参照していますが、そのようなプロパティ(getterメソッド)はint型には存在しないので NoSuchMethodException が発生します。これを catch で受け取っています。

catch に型を指定しないこともでき、そうすることであらゆる型のオブジェクトを受け取ることができます。また、1つの try に対して複数の catch を書くこともできます。その場合は、上から順に見て行って最初に型が一致したものが実行されます。
void main() {
  int a = 0;

  try {
    a.length;
  } catch (final var e) {
    /* ここが実行されます。 */
  }

  try {
    a.length;
  } catch (final NoSuchMethodException e) {
    /* ここが実行されます。 */
  } catch (final e) {
    /* ここは実行されません。 */
  }
}
例外発生箇所のスタックトレースを受け取るには、catch の2つめの要素として指定します。
void main() {
  int a = 0;
  try {
    a.length;
  } catch (final NoSuchMethodException e, var stack) {
    print("exception: $e");
    print("stack: $stack");
    /*
exception: NoSuchMethodException : method not found: 'get:length'
Receiver: 0
Arguments: []
stack: 0. Function: 'Object.noSuchMethod' url: 'bootstrap' line:2698 col:3
 1. Function: '::main' url: 'file:///home/dart-ing/dart/ExceptionTest/ExceptionTest.dart' line:4 col:13
     */
  }
}
このように例外を簡単に受け取ることができますが、実際には例外の発生を予期するのは難しいことです。コードの中で受け取られなかった例外は、実行環境側へ渡されて Unhandled exception としてそれぞれの方法で処理されます。

後処理を実装する

try を抜けた時に必ず実行されるコードを finally に書くことができます。サンプルコード
void main() {
  int a = 0;
  try {
    a.length;
  } catch (final NoSuchMethodException e) {
    print(e);
  }
  finally {
    print("finally");
  }
}
この場合、catch による例外処理が行われてから、最後に finally が実行されます。

例外を発生させる

例外を発生させるには throw を使います。サンプルコード
void main() {
  try {
    throw new Exception("message");
  } catch (final Exception e) {
    print(e); // Exception: message
  }
}

標準APIでの例外

Dartの標準API(dart:coreなど)にはあらかじめいくつかの例外が用意されています。それらはすべて Exception から派生した型になっています。例外についてはいろいろな考え方がありますが、自分で例外を用意する場合には Exception から派生した型を使ったほうがわかりやすいでしょう。

非同期処理でも例外を処理する必要があります。例えばファイルI/Oなどです。Dartでは File の非同期処理を Future を使って実装しているため、ファイルI/Oの例外処理をするならば Future の例外処理について知る必要があります。といっても特に難しいものではなく、例外が発生すると Future.handleException に指定した関数が呼ばれますので、そこで処理することになります。Future については以前の記事(Dartで未来(Future)の処理を実装する)も参考にしてください。

2012年5月1日火曜日

dart:domは使えなくなります

このエントリーをはてなブックマークに追加
公式サイトの情報(Deprecation notice: Migrate from dart:dom to dart:html)によるとdart:domライブラリはdart:htmlライブラリに統合され、今後は使用できなくなります。もともとdart:htmlの使用が推奨されていましたし、dart:domを使ったプログラムを作りこまれている方は少ないとは思いますが、もしdart:domを使用していた場合にはdart:htmlへ移行する必要があります。

dart:domからdart:htmlへの移行にあたっては、緊急避難として "$dom_古い名前" という形式のメソッド(例えば、Node.childNodes は Node.$dom_childNodes)としてdart:htmlライブラリ内に残されますが、いずれ消えることになりそうです。

今後は、dart:domの代わりにdart:htmlを使用します。dart:htmlの使用方法については Improving the DOM が詳しいです。簡単に説明すると次のように使います。
  • HTMLElementのようなHTMLXxxという名前の代わりに、単にXxxとなっています(例:ElementAnchorElement)。ちなみにSVGXxxはそのままSVGXxxです。
  • ノードを取り出すには getElementById などに代わって、Document.query と Element.queryAll という2つのメソッドを使います。
  • コレクションはDOMのものではなく、DartネイティブのListやMapが使われます。
  • 新規の要素を作るのにdocument.createElementとする必要はなく、Element.tag と Element.html コンストラクタを使用します。(例:new Document.tag('a') )
  • イベントは Document.on で取得した ElementEvents に設定します。