#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専用の自動化ツールをオーダーメイドで作成しています。気になる方はこちらをご覧ください。
コメント
コメントを投稿