Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Translated the block "Dealing with Files" into Japanese as "ファイル処理"

Excerpt
hiddentrue

Closures

クロージャ

Excerpt
hiddentrue

One of the things that makes Groovy different than most compiled languages is that you can create functions that are first class objects. That is you can define a chunk of code and then pass it around as if it were a string or an integer. Check out the following code:


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

Code Block

square = { it * it }

Excerpt
hiddentrue

The curly braces around the expression "it * it" tells the Groovy compiler to treat this expression as code. In the software world, this is called a "closure". In this case, the designator "it" refers to whatever value is given to the function. Then this compiled function is assigned to the variable "square" much like those above. So now we can do something like this:


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

Code Block

square(9)

Excerpt
hiddentrue

and get the value 81.


そしてその値として81が得られます。
Excerpt
hiddentrue

This is not very interesting until we find that we can pass this function "square" around as a value. There are some built in functions that take a function like this as an argument. One example is the "collect" method on arrays. Try this:


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

Code Block

[ 1, 2, 3, 4 ].collect(square)

Excerpt
hiddentrue

This expression says, create an array with the values 1,2,3 and 4, then call the "collect" method, passing in the closure we defined above. The collect method runs through each item in the array, calls the closure on the item, then puts the result in a new array, resulting in:


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

Code Block

[ 1, 4, 9, 16 ]

Excerpt
hiddentrue

For more methods you can call with closures as arguments, see the Groovy GDK documentation.


引数としてクロージャを呼び出すことができる他のメソッドとしては、Groovy GDK ドキュメントを参照してください。
Excerpt
hiddentrue

By default closures take 1 parameter called "it", you can also create closures with named parameters. For example the method Map.each() can take a closure with two variables, to which it binds the key and associated value:


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

Code Block

printMapClosure = { key, value -> println key + "=" + value }
[ "yue" : "wu", "lane" : "burks", "sudha" : "saseethiaseeleethialeselan" ].each(printMapClosure)

Excerpt
hiddentrue

Produces:


実行結果は:

Code Block

yue=wu
lane=burks
sudha=saseethiaseeleethialeselan

Excerpt
hiddentrue

More Closure Examples

さらなるクロージャの例

Excerpt
hiddentrue

Here are a few more closure examples. This first one shows a couple of things. First, the closure is interacting with a variable outside itself. That is, the closure's purpose is to put together the parts of a stock order held in the array orderParts, by adding (appending) it to the variable fullString. The variable fullString is not in the closure. The second thing that is different about this example is that the closure is "anonymous", meaning that it is not given a name, and is defined in the place where the each method is called.


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

Code Block

fullString = ""
orderParts = ["BUY", 200, "Hot Dogs", "1"]
orderParts.each {
  fullString += it + " "
}

println fullString

Excerpt
hiddentrue

You can probably guess what this prints out.


おそらくこの出力結果は推測できるでしょう。
Excerpt
hiddentrue

The next example is another anonymous closure, this time, summing up the values stored in a map.


次の例は、もうひとつの匿名クロージャで、今回マップに保持された値を加算していきます。

Code Block

myMap = ["asdf": 1 , "qwer" : 2, "sdfg" : 10]

result = 0
myMap.keySet().each( { result+= myMap[it] } )
println result
Excerpt
hiddentrue
Dealing with Files

ファイル処理

 

Excerpt
hiddentrue

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:

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

Code Block

myFileDirectory = "C:\\temp\\"
myFileName = "myfile.txt"
myFile = new File(myFileDirectory + myFileName)

printFileLine = { println "File line: " + it }

myFile.eachLine( printFileLine )
Excerpt
hiddentrue

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.

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

Excerpt
hiddentrue
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.

次の"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:

Code Block

stringDate = "2005-07-04"
dateArray = stringDate.split("-")
year = dateArray[0].toInteger()
year = year + 1
newDate = year + "-" + dateArray[1] + "-" + dateArray[2]

...