ラムダ計算を使う

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

関数(メソッド)として定義するような処理を、あたかも変数のように定義できたり、引数として渡したりできるような機能を使っているだろうか?C++11以降ではラムダ式が、最近のバージョンのObjective-C ((正確にはLLVM Clangで、ライブラリーあるいはフレームワークが使えればC及びC++も使用可能)) ではBlocksがこれにあたるのだが、もし知らないのであればぜひ使ってみたいところである。

使い方の例は以下の通りである。

C++

[code lang=”cpp”]#include <iostream>

int main()
{
auto printHello = []() -> void {
std::cout << "Hello, world" << std::endl;
};
printHello();
return 0;
}[/code]

Objective-C (Clang)

[code lang=”objc”]#import <Foundation/Foundation.h>

int main() {
void (^printHello)() = ^{
printf("Hello, world");
}
printHello();
return 0;
}[/code]

これを使うことによって、特定の関数でしか使用しないが、その関数内では何度も使い回すような処理を簡潔に書けるようになるというメリットがある。また、引数として渡せばその処理でしか使わない処理をわざわざ新しい関数あるいはメソッドで呼ぶというような必要性も無くなるという利点がある。

一方、従来は別のメソッドや関数で定義していた処理をその関数内で書くようになるため、処理の長大化を招く可能性もある点では注意が必要である。また、新しい書き方であるため、対応していない処理系の存在(ラムダ式は対応しているコンパイラーが増えつつあるが、Blocksは実質的にアップル系の処理系専用)のため、環境が対応してなければならないという問題点もある。

上記を踏まえて、必要に応じてラムダ式を使えるようにしたいところである。

タイトルとURLをコピーしました