Groovy クロージャが使える

「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 の宣言部は別として)
ラムダ式を使わないで書くと

List a = 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;
List a = 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 みたいな感じで書けたの。どっかで見た気がするんだけど。