トップ 差分 一覧 ping ソース 検索 ヘルプ PDF RSS ログイン

クロージャ



目次



記事一覧

キーワード

クロージャ(Closure)


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

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

 public static IList Managers(IList emps) {
   IList result = new ArrayList();
   foreach(Employee e in emps)
     if (e.IsManager) result.Add(e);
   return result;
 }

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

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

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

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

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

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

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



YAGI Hiroto (piroto@a-net.email.ne.jp)
twitter http://twitter.com/pppiroto

Copyright© 矢木 浩人 All Rights Reserved.