#20 Dartで学ぶ関数の応用(デフォルト引数・可変長引数)の基本

Dart(ダート)は、Googleが開発した言語で、スマホアプリを作れるFlutter(フラッター)というフレームワークの土台としてよく使われています。今回は、Dartの関数をもう一歩使いこなすための「デフォルト引数」と「可変長引数っぽい書き方」を紹介します。関数(function)とは、特定の処理をひとまとめにして名前を付けたもので、何度も同じ処理を書かずに済む便利な仕組みです。基本の書き方は知っている前提で、「引数を省略できるようにする方法」に焦点を当てます。

Dartの引数には2種類の「省略可能」がある

多くの言語では、引数(ひきすう。関数に渡す値のこと)は基本的にすべて必須で、可変長引数(渡す個数を自由に変えられる引数)には専用の記法が用意されています。ところがDartでは、引数を省略可能にする仕組みが最初から用意されており、「デフォルト引数」も「可変長引数のような処理」も自然に書けます。省略可能な引数には「位置引数のオプション化」と「名前付き引数」の2種類があります。

位置引数をオプションにする(角括弧 [] )

順番通りに値を渡す普通の引数(位置引数)を角括弧 [] で囲むと省略可能になり、省略時の値(デフォルト値)は = で指定します。

String greet(String name, [String honorific = "さん"]) {
  return "$name$honorificこんにちは";
}

void main() {
  print(greet("田中"));          // 田中さんこんにちは
  print(greet("田中", "先生"));  // 田中先生こんにちは
}

2つ目の引数を省略すると自動的に "さん" が使われます。呼び出し側のコードをシンプルに保ちたいときに便利です。

名前付き引数にする(波括弧 {} )

もう1つの方法が、波括弧 {} を使う「名前付き引数」です。呼び出すときに引数名を明示するため、どの値が何を表しているか一目で分かります。

void showProfile({String name = "名無し", int age = 20}) {
  print("$name($age歳)");
}

void main() {
  showProfile();                       // 名無し(20歳)
  showProfile(name: "佐藤", age: 30);  // 佐藤(30歳)
}

引数の順番を気にせず渡せる点も特徴です。Pythonのキーワード引数に近い感覚ですが、Dartでは {} という専用構文で明示的に区別されます。

required で必須にすることもできる

required を付けると名前付き引数を「省略不可」にできます。デフォルト値と required は同時に使えません。

void order({required String item, int quantity = 1}) {
  print("$item を $quantity 個注文しました");
}

void main() {
  order(item: "コーヒー"); // コーヒー を 1 個注文しました
}

可変長引数のような処理はリストで表現する

JavaScriptの ...args やPythonの *args のように、個数が決まっていない引数をまとめて受け取る専用構文はDartにはありません。代わりにリスト(配列のようなもの)を渡すことで同じ目的を達成します。

int sumAll(List<int> numbers) {
  int total = 0;
  for (var n in numbers) {
    total += n;
  }
  return total;
}

void main() {
  print(sumAll([1, 2, 3]));        // 6
  print(sumAll([10, 20, 30, 40])); // 100
}

呼び出し側は角括弧でリストを作って渡すだけなので、慣れれば不便には感じません。「渡す値の集まりがリストである」ことが明示され、コードの意図が読み取りやすくなるとも言えます。

つまずきやすいポイント

位置引数のオプション化( [] )と名前付き引数( {} )は1つの関数内で同時には使えません。どちらの方式にするか最初に決めておくとスムーズです。また、デフォルト値には定数(コンパイル時に確定する値)しか指定できないため、実行時に変わる値(現在時刻など)をデフォルトにしたい場合は、いったん null をデフォルトにし、関数の中で判定する方法がよく使われます。

まとめ

Dartの関数は、角括弧 [] による位置引数のオプション化と、波括弧 {} による名前付き引数という2つの仕組みで、デフォルト引数や柔軟な呼び出し方を実現しています。可変長引数の専用構文はありませんが、リストを渡すことで同じ役割を果たせます。Flutterのウィジェット(画面部品)では名前付き引数が非常によく登場するので、押さえておくと今後のコードが読みやすくなるはずです。

関連記事


本ページはプロモーションを含みます。

参考書籍(PR)

Dartをもっと学びたい方には「ゼロから学ぶFlutterアプリ開発」がおすすめです。


PR

コードを書かずに自動化したい方へ

「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動くWindows専用の自動化ツールをオーダーメイドで作成しています。気になる方はこちらをご覧ください。

コメント

このブログの人気の投稿

#25 Rustで学ぶAI API(ChatGPT等)の呼び出し方の基本

#8 C++で学ぶ文字列操作の基本

#16 TypeScriptで学ぶ辞書型(マップ)の基本