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
}


こちらもどうぞ

0 件のコメント:

コメントを投稿