Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 13 Next »

クロージャ


Groovyがほとんどのコンパイル言語と異なることの一つに、原始的なクラスオブジェクトとして関数を生成できることです。それによりコードの一塊が定義でき、あたかもStringかIntegerのインスタンスであるかのように取り扱うことが可能になります。


中括弧で囲まれた式「it * it」は、この式をコードとして扱うようにGroovyコンパイラに告げています。ソフトウエア用語として、これを「クロージャ」といいます。この場合、指示子"it"は、関数で与えられるいかなる値も示します。そしてこのコンパイルされた関数は上記のように変数"square"に割り当てられます。したがって今関数のように呼び出すことができます:


そしてその値として81が得られます。
このクロージャの関数のような機能は、「square」を引数のように渡すことできることに気づくまではそんなに興味深いことではありませんでした。このような引数として関数を引き渡すいくつかの組込み関数が存在しています。その例としては配列の「collect」メソッドがあります。次を実行してみましょう:


この式は、値1,2,3,4をもつ配列を生成して、上で定義したクロージャを引数として「collect」メソッドを呼び出します。このcollectメソッドは、配列における各要素を順番に引数としてクロージャ「square」をコールして、その結果を新しい配列に入れていきます。その結果は次のようになります:


引数としてクロージャを呼び出すことができる他のメソッドとしては、Groovy GDK ドキュメントを参照してください。
デフォルトでは、クロージャは「it」というひとつのパラメータを取りますが、パラメータを指定してクロージャを生成することもできます。例えば、メソッド Map.each()は、キーとそれに関するバリューをバインドする、2つの変数をもつクロージャを引数に取ります:


実行結果は:

さらなるクロージャの例


ここで、さらにいくらかのクロージャの例を見ます。最初に、2つのクロージャをみていきます。1つ目のクロージャは、そのクロージャの外にある変数に影響をあたえます。つまり、このクロージャの目的は、変数fullStringにitを追加することにより、配列orderParts内にあるスタック順の要素を一つにまとめることです。変数fullStringはクロージャの中にはありません。この2つ目の例で異っているのは、クロージャが「匿名」であるということです、つまり、与えられた名前がなく、それぞれのメソッドが呼ばれる場所で定義されます。


おそらくこの出力結果は推測できるでしょう。
次の例は、もうひとつの匿名クロージャで、今回マップに保持された値を加算していきます。

ファイル処理

 

ファイルからデータを読み込むのは比較的に簡単です。まずはmyfile.txtという名前のテキストファイルを作成します。ファイルの中身はどんな内容でもいいので、適当に文字を入力してからC:ドライブの\tempフォルダに保存して下さい。そしてgroovyConsoleで以下のコードを入力して下さい:

このコードはファイル内の各行の先頭に"File line: "をつけて出力します。コードの最初の二行はファイルの場所を示す変数を宣言するだけです。変数の名前は特に意味ありません。これらの変数を使う時も、単に内容を結合するだけです。ここで注意すべきのは、Groovyではバックスラッシュ記号に特殊な意味合いがあるので、"本当のバックスラッシュ記号"を表現したい場合、二回書く必要があります。

次の"myFile ="で始まる行は、新しいFileオブジェクトを作成します。オブジェクトというのは関連性を持つメソッドとデータの集合です。たとえば、ファイルオブジェクトは場所を示すデータ(この例でいうと"C:\temp\myfile.txt")を持っていて、存在しているファイルを削除するためメソッドも持っているかもしれません。この例で使用するメソッドは、最後の行で呼び出したeachLineメソッドだけです。その前の行はクロージャの定義で、ここまで来て何回も見たはずです。

Dealing with strings

Strings in Groovy have all the same functionality of Java strings. That is, a Groovy string is just a Java string with a few extra things added to it. Because of that, we can refer to the Java documentation for the String class to find out some of the interesting things we can do with it. For example, look in the section entitled '''Method Summary''' at the description for the '''split''' method. This method does something very useful, which is to split a string based on a regular expression. We will talk more about regular expressions later, but for now the only thing you have to know is that the simplest regular expression is a single character. So let's say that we want to split up the components of the date "2005-07-04", so that we can add one to the year to get the date of next fourth of July. We might:

This code brings together a bunch of things we have talked about before. There are two new things, first is the use of the split method on a String. Second is the call of toInteger() on a String. This call to toInteger simply tells Groovy that you want to treat that data as a number rather than a String. See what happens if you run the same code without ".toInteger()" at the end of the third line.

Another thing you might notice is that toInteger is not listed in the Java documentation for string. That is because it is one of the extra features that Groovy has added to Strings. You can also take a look at the documentation for the Groovy extensions to Java objects.

  • No labels