「クロージャ」の版間の差分
ナビゲーションに移動
検索に移動
| 1行目: | 1行目: | ||
| − | ==クロージャ(Closure)== | + | ==[[クロージャ]](Closure)== |
http://martinfowler.com/bliki/Closure.html | http://martinfowler.com/bliki/Closure.html | ||
| − | + | [[クロージャ]]とは、関数に、引数として渡せるコードブロック。 | |
| − | EmployeeからManagerを抜き出すには、C#( | + | EmployeeからManagerを抜き出すには、C#([[クロージャ]]を持たない)では、以下のようにするだろう |
public static IList Managers(IList emps) { | public static IList Managers(IList emps) { | ||
| 12行目: | 12行目: | ||
return result; | return result; | ||
} | } | ||
| − | + | [[クロージャ]]を持つ、Rubyなら以下のようにする。 | |
def managers(emps) | def managers(emps) | ||
| 18行目: | 18行目: | ||
end | end | ||
| − | + | Cでの関数ポインタ、[[Java]]での無名クラス、C#でのデリゲートで、同じようなことができるが、違いがある。 | |
1つは、定義された時点での変数が参照できること。 | 1つは、定義された時点での変数が参照できること。 | ||
| 28行目: | 28行目: | ||
end | end | ||
| − | + | また、以下の関数は、引数に依存した振る舞いをする[[クロージャ]]を返している。 | |
def paidMore(amount) | def paidMore(amount) | ||
| 35行目: | 35行目: | ||
*[http://nonn-et-twk.net/twk/closure/ JavaScriptでの例] | *[http://nonn-et-twk.net/twk/closure/ JavaScriptでの例] | ||
| − | *SJC-P インナークラス | + | *[[SJC-P インナークラス]] |
2020年2月16日 (日) 04:19時点における最新版
クロージャ(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
© 2006 矢木浩人