2012年3月8日木曜日

新しいDart Editor(ビルド5104)が公開されています

このエントリーをはてなブックマークに追加
新しいDart Editor(ビルド5104)が公開されています。

ダウンロードはこちらから。
Tutorial: Dart Editor : Dart : Structured web programming

もっとも大きな変更点は、従来のライブラリビューがなくなり、新たにファイルビューが用意されたことです。Dart Editorを起動すると左にファイルビューが表示されます。スクリーンショットはサンプルのclockを開いた状態です。

ひとつ前のバージョン(ビルド4760)では次のようになっていました。

パッと見て2つ気が付きます。

  • 標準のライブラリが表示されないようになった
  • Dartライブラリではないもの(ディレクトリや画像ファイルなど)が表示されるようになった
ファイルビューには標準のライブラリが表示されないため、ライブラリビューからそのソースを表示できなくなったのですが、コードから追っていくことは可能です。

開きたいファイルが書かれた #import ディレクティブを右クリックし、メニューから Open Declaration を選択すると、今まで通り指定のライブラリ ファイルが開かれます。

2012年3月7日水曜日

Dartの関数宣言と呼び出し

このエントリーをはてなブックマークに追加
Dartの関数はJavaやCなどに近い書き方で記述します。
String greeting(String name) {
  String words = 'Hello, ${name}!';
  print(words);
  return words;
}
return文を通らずに関数を抜けた場合(例外が発生した場合を除く)、エラーにはならずnullが返ります。

関数の中に式がひとつしかないときは、次のような書き方もできます。この場合、関数の戻り値は式の値になります。
String greeting(String name) => 'Hello, ${name}!';
無名関数も同じように書くことができます。
main() {
  Function greeting1 = (name) { return 'Hello, ${name}!'; };
  print(greeting1('world'));
  // 書き方が違うだけで同じ。
  Function greeting2 = (name) => 'Hello, ${name}!';
  print(greeting2('world'));
}
無名関数はコレクションの処理ではよく使われます。サンプルコード
main() {
  var even = [1, 2, 3, 4].filter((e) => e % 2 == 0);
  even.forEach((e) => print(e)); // 2 4
}
関数を返す関数も書くことができます。クロージャとしての使い方も可能です。サンプルコード
newCounter() {
  var i = 0;
  return () => ++i;
}

main() {
  var c = newCounter();
  print(c()); // 1
  print(c()); // 2
  print(c()); // 3
}
関数には省略可能なパラメーターが指定できます。省略可能なものについてはかっこ [] で囲います。また、省略可能なパラメーターにはデフォルト値が指定できます。省略可能なパラメーターで、デフォルト値がないものについて省略した場合、nullが設定されます。サンプルコード
// 仮引数twoとthreeは省略可能。
void printNumber(int one, [int two, int three = 3]) {
  print('${one}, ${two}, ${three}');
}

main() {
  printNumber(1, 2, 3); // 1, 2, 3 
  printNumber(1, 2);    // 1, 2, 3
  printNumber(1);       // 1, null, 3
                        // デフォルト値がない引数が省略されるとnullになる。
}
ただし、インターフェイスや抽象メソッドではデフォルト値を指定できません。サンプルコード
interface I {
  // void greeting([String name = 'world']);
  // 上の宣言はエラー。次のようにデフォルト値がなければ問題ない。
  void greeting([String name]);
}

class C implements I {
  // 抽象メソッドでなければデフォルト値を指定可能。
  void greeting([String name = 'world']) {
    print('Hello, ${name}!');
  }
}

main() {
  new C().greeting(); // Hello, world!
}
また、省略可能なパラメーターは名前付きの引数指定に対応します。サンプルコード
void printNumber(int one, [int two, int three]) {
  print('${one}, ${two}, ${three}');
}

main() {
  printNumber(1, three: 3);    // 1, null, 3
}


こちらもどうぞ

2012年3月6日火曜日

Dartでクラスや変数の見え方を制御する

このエントリーをはてなブックマークに追加
Dartでは、識別子の前にアンダーバー _ をつけると、識別子を定義したライブラリ内でしか見えなくなり、ライブラリの外から参照しようとするとエラーになります。いわゆるプライベートです。

mylib.dart
#library('my_lib');
class A {
  String x;
  String _y;
}
#import('mylib.dart');
main() {
  A a = new A();   // OK
  a.x = 'a';       // OK
  a._y = 'a';      // NG
}
メンバー変数だけではなく、メンバー関数や、トップレベルのクラス、関数、変数も同様の方法でプライベートにすることができます。

なお、この機能はライブラリ外から見えなくなるだけで、メンバーをプライベートにしても、同じライブラリ内からは別のクラスからでも参照することができます。
#library('my_lib_2');
class A {
  String x;
  String _y;
}

class _B {}

class Test1 {
  void test() {
    A a = new A();   // OK
    a.x = 'a';       // OK
    a._y = 'a';      // OK

    _B b = new _B(); // OK
  }
}

class Test2 extends A {
  void test() {
    x = 'a';  // OK
    _y = 'a'; // OK
  }
}


こちらもどうぞ