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 10 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つ目の例で異っているのは、クロージャが「匿名」であるということです、つまり、与えられた名前がなく、それぞれのメソッドが呼ばれる場所で定義されます。


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

Dealing with Files

Reading data from files is relatively simple. First create a text file, and call it myfile.txt. It doesn't matter what's in it, just type some random text into it and save it on your C: drive in the \temp directory. Then type the following code in the groovyConsole:

This should print out every line in the file prefixed with "File line: ". The first two lines of the code simply declare variables to specify where the file is located. The variable names don't have any special significance, and as you can see, all we do is combine them when we use them. Note that because the backslash character has special meaning in groovy, you have to use two of them to tell it that you '''really''' mean a backslash.

The next line that starts "myFile =" creates a new File object. An object is simply a collection of related methods and data. For example, a file object might have data describing its location, in this case "C:\temp\myfile.txt", and maybe a method to delete the file if it exists. In this case the only method we are going to use is the eachLine method, which we call in the last line of code. The line before that is a simple closure definition, that you have seen several times by this point.

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