| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

「クロージャ」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
(ページの作成:「==クロージャ(Closure)== http://martinfowler.com/bliki/Closure.html クロージャとは、関数に、引数として渡せるコードブロック。 Employ…」)
 
 
(同じ利用者による、間の1版が非表示)
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なら以下のようにする。
+
[[クロージャ]]を持つ、Rubyなら以下のようにする。
  
 
  def managers(emps)
 
  def managers(emps)
18行目: 18行目:
 
  end
 
  end
  
Cでの関数ポインタ、Javaでの無名クラス、C#でのデリゲートで、同じようなことができるが、違いがある。
+
Cでの関数ポインタ、[[Java]]での無名クラス、C#でのデリゲートで、同じようなことができるが、違いがある。
  
 
1つは、定義された時点での変数が参照できること。
 
1つは、定義された時点での変数が参照できること。
25行目: 25行目:
 
  def highPaid(emps)
 
  def highPaid(emps)
 
   threshold = 150
 
   threshold = 150
   return emps.select {|e| e.salary > threshold}
+
   return emps.select {|e| e.salary > threshold}
 
  end
 
  end
  
また、以下の関数は、引数に依存した振る舞いをするクロージャを返している。
+
また、以下の関数は、引数に依存した振る舞いをする[[クロージャ]]を返している。
  
 
  def paidMore(amount)
 
  def paidMore(amount)
   return Proc.new {|e| e.salary > amount}
+
   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月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