- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!クロージャ(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 インナークラス