「Groovy イン・アクション」を読んでる。今 38ページ だ。
ここで、クロージャ というものが紹介されていた。
クロージャって聞いた事あったんだけど、実際どんなんか知らなくて興味津々。
シンプルな例が載ってたんだけど、
[1, 2, 3].each { entry -> println entry }
これってどっかで見たことある気がする。ああそうだ C# でも同じ事できるやん。
List
a = new List {1, 2, 3};
a.ForEach(entry => Console.WriteLine(entry));
ラムダ式を使って書いたから、ほぼ Groovy のコードと同じように見える。(List の宣言部は別として)
ラムダ式を使わないで書くと
Lista = new List {1, 2, 3}; a.ForEach(delegate(int entry){ Console.WriteLine(entry); });
なんだ、匿名メソッドと似てるんだ。
もう一つサンプルが載ってて、これは、1 から 100 迄の総和を クロージャを使って実装したサンプル。(※一部改変)
def totalClinks = 0 def partyPeople = 100 1.upto(partyPeople) { guestNumber -> clinksWithGuest = guestNumber - 1 totalClinks += clinksWithGuest } println totalClinks
upto メソッドは、Integer クラス を Groovy が拡張したメソッドなのかな?数値とクロージャをパラメータに取る。(groovysh から inspect で確認した)
現在値から指定した値(パラメータの数値)までの全ての Integer について順に処理(パラメータのクロージャ)する。
これも、匿名メソッドで出来る。
int totalClinks = 0;
int partyPeople = 100;
Lista = new List ();
for (int i = 1; i <= partyPeople; i++) a.Add(i);
a.ForEach(guestNumber => totalClinks += (guestNumber - 1));
Console.WriteLine(totalClinks);
Groovy の upto は今のところ C# には無いはず。これはすごい便利だから欲しい。てか、upto っていうより、1 から 100 迄が要素にあるリストの宣言が
List
a = new List {1..100};
みたいな感じにかけたら upto がなくてもいいや。
これって何かの言語でなかったけ?配列かリストかの宣言が、1..10 みたいな感じで書けたの。どっかで見た気がするんだけど。