🚄

無名関数(クロージャ)と即時実行関数

2024/08/07に公開

はじめに

無名関数(クロージャ)と即時実行関数について、DartとSwiftを例にまとめました。
筆者はDart初学者ですが、Swiftもある程度知っているので二つの言語で例を挙げています。

無名関数(クロージャ)とは

無名関数(anonymous function)(クロージャ)とは、関数名のない処理のかたまりです。
一時的な処理を書きたいときに便利です。
変数に代入したり、他の関数に渡したり、その場で定義して使用したりすることもできます。

Dartでは以下のように書きます。

ClosureSample.dart
var add = (int a, int b) {
  return a + b;
};

また、アロー関数を利用してより簡潔に書くこともできます。

ClosureSample.dart
var add = (int a, int b) => a + b;

Swiftでは以下のように書きます。文が一つしかない場合は、returnを省略することもできます。

ClosureSample.swift
var add = { (a: int, b: int) -> Int in
  return a + b
}

また、型推論を利用してより簡潔に書くこともできます。

ClosureSample.swift
var add = { (a, b) in
  return a + b
}

即時関数とは

即時関数(Immediately Invoked Function Expression, IIFE)とは、定義と同時に処理が実行される関数です。
初期化処理や一度きりの処理を行いたい場合に便利です。
変数のスコープを制御することができます。

Dartでは以下のように書きます。

ItfeSample.dart
(() {
  print('即時実行されました');
})();

Swiftでは以下のように書きますが、あまり見かけません。変数の初期化時にそのまま値を設定するのが一般的なためです。また、クロージャが即時関数と同様の目的を果たすため、クロージャを利用することが多いことも背景にあります。

ItfeSample.swift
let result = { () -> String in
  print("即時実行されました")
  return "Hello, World!"
}()

Flutterアプリ(Dart)における実際の使用例

Flutterアプリにおける実際の使用例を挙げます。
以下は、AppBarleadingプロパティに無名関数を即時実行して設定する例です。

Sample.dart
AppBar(
  leading: () {
    return IconButton(
      icon: Icon(Icons.menu),
      onPressed: () {
        print('Menu button pressed');
      },
    );
  }(),
  title: Text('My App'),
)

leadingプロパティに無名関数を定義し、即時に実行してIconButtonウィジェットを返しています。
この場合、無名関数内でIconButtonを作成し、即座にその結果がleadingに設定されます。

なぜ無名関数・即時関数を使うのか

  • 例えば、leadingのようなプロパティに特定の処理を含むウィジェットを即座に設定したい場合に使われます。
  • 一度限りの処理をまとめて書くことで、コードが読みやすくなります。

おわりに

無名関数と即時関数についてまとめました。
より一層言語の特徴を理解し、意識しながらコードを書いていきたいですね。
最後までお読みいただき、ありがとうございました。

Discussion