トップ 一覧 ping 検索 ヘルプ 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#でのデリゲートで、同じようなことができるが、2つの違いがある。
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

[JavaScriptでの例|http://nonn-et-twk.net/twk/closure/]
*[JavaScriptでの例|http://nonn-et-twk.net/twk/closure/]
*SJC-P インナークラス