「クロージャ」の版間の差分
ナビゲーションに移動
検索に移動
(ページの作成:「==クロージャ(Closure)== http://martinfowler.com/bliki/Closure.html クロージャとは、関数に、引数として渡せるコードブロック。 Employ…」) |
|||
25行目: | 25行目: | ||
def highPaid(emps) | def highPaid(emps) | ||
threshold = 150 | threshold = 150 | ||
− | return emps.select {|e| e.salary | + | return emps.select {|e| e.salary > threshold} |
end | end | ||
31行目: | 31行目: | ||
def paidMore(amount) | def paidMore(amount) | ||
− | return Proc.new {|e| e.salary | + | return Proc.new {|e| e.salary > amount} |
end | end | ||
*[http://nonn-et-twk.net/twk/closure/ JavaScriptでの例] | *[http://nonn-et-twk.net/twk/closure/ JavaScriptでの例] | ||
*SJC-P インナークラス | *SJC-P インナークラス |
2020年2月15日 (土) 07:59時点における版
クロージャ(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
- JavaScriptでの例
- SJC-P インナークラス
© 2006 矢木浩人