| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

クロージャ

提供: MyMemoWiki
ナビゲーションに移動 検索に移動

クロージャ(Closure)

http://martinfowler.com/bliki/Closure.html

クロージャとは、関数に、引数として渡せるコードブロック。 EmployeeからManagerを抜き出すには、C#(クロージャを持たない)では、以下のようにするだろう

  1. public static IList Managers(IList emps) {
  2. IList result = new ArrayList();
  3. foreach(Employee e in emps)
  4. if (e.IsManager) result.Add(e);
  5. return result;
  6. }

クロージャを持つ、Rubyなら以下のようにする。

  1. def managers(emps)
  2. return emps.select {|e| e.isManager}
  3. end

Cでの関数ポインタ、Javaでの無名クラス、C#でのデリゲートで、同じようなことができるが、違いがある。

1つは、定義された時点での変数が参照できること。 以下の例では、ローカル変数を参照している。

  1. def highPaid(emps)
  2. threshold = 150
  3. return emps.select {|e| e.salary > threshold}
  4. end

また、以下の関数は、引数に依存した振る舞いをするクロージャを返している。

  1. def paidMore(amount)
  2. return Proc.new {|e| e.salary > amount}
  3. end