libro
www.tuyano.com
初心者のためのDart 2入門

関数を利用する (6/6)

作成:2018-03-31 08:12
更新:2018-03-31 08:12

■クロージャとは?

ラムダ式は、forEach以外のところでも使うことができます。例えば、関数の戻り値(returnで返す値)としてラムダ式を使うことができます。

下のリスト欄に、簡単な利用例を挙げておきました。ここでは、multiという関数の戻り値としてラムダ式を使っています。この文ですね。
return (i) => pow(i,n);
powというのは、dart:mathというライブラリに入っている関数です。Dartでは、自分で作る関数だけでなく、標準で多くの関数が入っています。こうした標準のライブラリに組み込まれている機能を使う場合は、
import 'ライブラリの指定' ;
このようにして、使いたいライブラリをインポートします。ここでは、dart:mathというライブラリをインポートしていたわけです。

powは、階乗を計算する関数です。これは、元になる値と指数を引数で指定します。例えば、10の2乗ならば、pow(10, 2) とするわけです。

multi関数では、nという引数が用意されています。そして、ラムダ式ではiという引数が用意されています。これらを使い、pow(i, n) の値が返されるようにしているのですね。まず、この点を頭に入れておいて下さい。

では、multi関数を呼び出している部分を見てみましょう。ここでは、例えばこのように実行をしています。
var f2 = multi(2);
これで、変数f2には何が入るでしょうか。それは、multi関数で返されたラムダ式による関数です。multi関数の定義をよく見て下さい。戻り値の指定に「Function」というものが指定されていますね? このFunctionとは、「関数」の型なのです。multi(2) では、こういうラムダ式がreturnで返されます。
(i) => pow(i,2);
引数iの値を2乗するラムダ式が返されていることがわかります。これが、f2に入っているのです。そしてこのf2を利用してる文、
  var n = 2;
  print(f2(n));
ここでは、f2(2)が呼び出され、pow(2, 2) の値が返されるようになっていた、というわけです。ちょっとややこしいですが、この流れをよく頭に入れて下さい。


■クロージャは環境を保持する

ここでの、返されたラムダ式の値は「クロージャ」と呼ばれます。クロージャは、関数の処理と同時に、それが保管された時の環境も保持している特殊な関数の値です。

「環境を保持している」というのはイメージしにくいでしょうが、例えば今の例では、multi(2)で返されたクロージャは、multi(2)で渡された「2」という引数の値がそのまま保持されていることがわかります。これはラムダ式がreturnされ変数に代入された、そのときの環境をそのまま保持している、と考えることができます。これがクロージャの特徴です。

クロージャは、そのクロージャ自身が作成されたときの環境を保持したまま処理を実行します。慣れないと動作がわかりにくいでしょうが、さまざまな使い方ができる機能ですので、基本的な使い方ぐらいは覚えておきたいですね!

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

import 'dart:math';

void main() {
  var f2 = multi(2);
  var f3 = multi(3);
  var f4 = multi(4);
  
  var n = 2;
  print(f2(n));
  print(f3(n));
  print(f4(n));
}

Function multi(n) {
  return (i) => pow(i,n);
}
※関連コンテンツ

「初心者のためのDart 2入門」に戻る