※本記事で使用している環境
<パソコン>
機種:MacBook Air(13inch)
OS:macOS Sonoma(ver.14.5)
<ソフトウェア>
・GoogleChrome(ver.126.0.6478.127)
・DartPad(Dart 3.4.3・Flutter 3.22.2)
前回は、繰り返し処理について解説しました。
今回は、関数について解説します。
おすすめ書籍
関数とは
以前、変数を扱いました。
変数は、何らかの値をいれるための箱のようなものと説明しました。
では、関数とは何でしょうか。
関数とは何らかの処理をまとめて、必要に応じて結果を呼び出し元に返すもの
基本的な記述方法
まず、基本的な用語を押さえましょう。
<引数>
関数に値を渡すための箱
<戻り値>
関数が処理をして返す結果
仕事に例えると、材料を仕入れる部分が「引数」、加工して付加価値を生み出す部分が「関数」、出来上がった商品・サービスが「戻り値」です。
戻り値を返す場合
では、早速以下のコードを書いてみましょう。
int add(int a, int b) {
return a + b;
}
void main() {
var answer1 = add(1, 2);
print(answer1);
}
①の部分で、関数を定義しています。
<関数の内容>
関数の型(戻り値の型): int
関数名: add
引数: int a、int b
戻り値: a + b
②の部分では、add 関数を呼び出し、引数として、1と2を渡しています。
そして、その結果を変数 answer1 に代入しています。
③では、print 関数を呼び出し、引数で変数 ansewer1 を渡しています。
ここで、「void main()」と書かれている部分が気になった方もいるでしょう。
気づいた方は鋭いです。
よく使われるこの main 関数は、戻り値を返しません。
そのため、main の前に void と記述します。
次は、以下のコードを入力してみましょう。
int multiply(int a, int b) {
return a * b;
}
void main() {
print(multiply(1, 2));
}
先ほどと同じく、①の部分で、関数を定義しています。
今回は、掛け算をしてその答えを戻り値として返す関数になっています。
<関数の内容>
関数の型(戻り値の型): int
関数名: multiply
引数: int a、int b
戻り値: a * b
②の部分では、multiply 関数を呼び出し、引数として、1と2を渡しています。
そして、さらにそれを print 関数の引数として渡しています。
戻り値を返さない場合
多くの場合は、関数が引数を受け取って、何らかの処理を行い、戻り値を返すのでした。
しかし、処理を実行するだけで、戻り値を返さない関数もあります。
以下のように、関数を作成し、呼び出してみましょう。
void show(int a, int b) {
print("$a and $b are passed.");
}
void main() {
show(1, 2);
}
①の部分で、関数を定義しています。
<関数の内容>
関数の型: void(戻り値を返さないから)
関数名: show
引数: int a、int b
②の部分では、show 関数を呼び出し、1と2を引数として渡しています。
関数の中に、print 関数が入っているので、プログラムを実行すると画面に「1 and 2 are passed.」という文字列が表示されます。
注意点
関数を定義する時に、int を記述し忘れたとしても大丈夫です。
add(int a, int b) {
return a + b;
}
void main() {
var answer1 = add(1, 2);
print(answer1);
}
結果は、int を記述したときと同じように出力されました。
これは、Dart に補完機能があるからです。
試しに、関数のまえに void と入力してみましょう。
void add(int a, int b) {
return a + b;
}
void main() {
var answer1 = add(1, 2);
print(answer1);
}
コンパイルエラーが起こりました。
戻り値があるのにもかかわらず、戻り値を返さない void を入力したため、矛盾が生じているからです。
名前付き引数
引数を受け取る時に、これまでのように1つか2つの引数であればそこまで不便を感じません。
しかし、引数の数が多くなればなるほど、引数の並び順がややこしくなり、どの引数が関数内のどの変数に対応しているのかがややこしくなります。
そこで、明示的にわかりやすくしようと作られたのが 名前付き引数で す。
以下のように、引数の部分に「中括弧{ }」を加えて、その中に引数を記述します。
int add({int b, int a}) {
return a + b;
}
void main() {
print(add(a: 1, b: 2));
}
ただ、この状態だとエラーが起きてしまいました。
int b と int a が null である可能性があるためです。
明示的に、null 出ないことを示す必要があります。
方法は2つあります。
- null 出ないことを示す
- null である可能性を許容する記述をする
null 出ないことを示す
①の方法は、引数の前に「required」と記述します。
null ではないということを表します。
int add({required int b, required int a}) {
return a + b;
}
void main() {
print(add(a: 1, b: 2));
}
エラーが起きずに、プログラムを実行することができました。
null である可能性を許容する記述をする
②の方法は、以前も紹介したように型名のあとに「?」を記述します。
int add({int? b, int? a}) {
return a + b;
}
void main() {
print(add(a: 1, b: 2));
}
ただし、これだけだとコンパイルエラーが起きてしまいます。
受け取った引数が null であった場合に、戻り値を返せないのです。
そこで、変数 a と変数 b の後ろに「!」を追加します。
int add({int? b, int? a}) {
return a! + b!;
}
void main() {
print(add(a: 1, b: 2));
}
すると、うまくプログラムを実行することができました。
ちなみに、コードの詳細を解説すると、上の部分で add 関数を宣言し、main 関数の中で print 関数を呼び出し、さらにその中で作成した add 関数を呼び出しています。
その際、引数を「変数名: 値」と記述することで、特定の変数を指定して値を渡しています。
デフォルト引数
デフォルト引数は、あらかじめに値を設定しておき、引数の受け渡しがなかった場合に使用するというものです。
たとえば、以下のコードでは、変数 b に 2 を代入してあります。
そのため、変数 b に引数の受け渡しがなければ、この 2 がそのまま使用されます。
int add2(int a, {int b = 2}) {
return a + b;
}
void main() {
print(add2(1));
}
実際、add 関数に 1 という値のみが渡されましたが、デフォルト引数があるおかげで a + b が実行できました。
もちろん、以下のコードのように、関数を呼び出す際に、デフォルト引数の部分を指定し直すこともできます。
int add2(int a, {int b = 2}) {
return a + b;
}
void main() {
print(add2(1));
print(add2(2, b: 5));
}
デフォルトで設定した b = 2 が b = 5 に書き換えられたため、2 + 5 が実行されました。
オプショナル引数
オプショナル引数は、先ほどと違い「2つ目の引数はあってもいいんだけど、なくてもいいな」というイメージです。
以下のように、引数を記述する場所に「四角括弧[ ]」を記述します。
その際、null である可能性があるため、null を許容する「?」を型名の後ろに記述します。
int add3(int a, [int? b]) {
return a + b;
}
void main() {
print(add3(1));
print(add3(1, 2));
}
ただし、またもやコンパイルエラーが起きてしまいました。
変数 b が null である可能性があるため、a + b を行うことができないのです。
そこで、null チェックといわれるものを行います。
以前紹介した分岐処理を用いて、nullである場合とそうでない場合で処理を分けて記述します。
以下のコードでは、変数 b が null ではない場合に、a + b を行い、null である場合は、引数として受け取った変数 a をそのまま戻り値として返しています。
int add3(int a, [int? b]) {
if (b != null) {
return a + b;
}
return a;
}
void main() {
print(add3(1));
print(add3(1, 2));
}
これで、無事にプログラムを実行することができました。
これにて、関数の解説は終わりです。
次は、クラスについて紹介します。
コメント