こんにちは!なるーらぼです。今回は関数についてみていきたいと思います。関数、といっても実際にはメソッドになります。厳密には「関数的メソッド」となるでしょう。
関数
Groovyにおいて、関数はJavaのメソッドにあたります。しかし実際には「org.codehaus.groovy.runtime.MethodClousure」のインスタンスです。ということは・・・?そうです、関数ではありません。
さて、関数の定義はいろんな方法があります。defキーワードと関数名、そして波括弧で関数の実装を記述します。
def hello() {
println "Hello"
}
これを呼び出すには「hello()」とするだけです。もちろん、値を返すこともできます。
文字列を返すように書き換えると次のようになります。
def hello() {
"Hello"
}
どうやって値を返しているのか?rubyを書いたことがある方はピンとくるかと思います。最後に評価された内容が自動的に返されます。ですから、書き換える前はprinlnの実行で何も返さないのでnullが返されていました。
なお、明示的に返す値を記述したい場合はJavaと同様に「return」を使ってください。
def hello() {
return "Hello"
}
値を返すとして、返す値の型を明示したくなるのも世の常ですよね。上記のコードはStringを返すのでそのようにしてみます。
String hello() {
"Hello"
}
何も値を返さない場合はJavaと同様に「void」をつけても大丈夫です。
void hello() {
"Hello"
}
引数
ここまで、上述したコードの例において関数には引数を与えませんでした。今度は引数を与えてみます。
def hello(name) {
println "hello, $name !"
}hello("nalulabo")
hello "nalulabo" // 丸括弧を省略した場合
複数の引数を与える場合はカンマで区切りましょう。
また、引数にも型を明示することができます。
def hello(String name, int num){
println "hello!" * num + "$name !"
}
2つ目の引数はint型を要求していますので、数値以外を指定するとエラーになります。
もし必須の引数より後に指定するのであれば、指定する数が可変の引数も受け入れることができます。
def hello(String name, Object... args) {
if(args.size() == 0){
println "hello. $name"} else {
println "$args, $name"
}
}
実行するときにはパラメータの「name」が必須で、残りの引数は0以上指定してあれば大丈夫です。
hello "nalulabo" // hello, nalulabo
hello "nalulabo", "aaa", "bbb" // [aaa, bbb], nalulabo
上記ではObject型にしてありますが、普通の型でも問題ありません。このドット記号3つのものは実は配列として型をつけたものの別名になっています。ですから、先ほどの例は次のコードと同じになります。
def hello(String name, Object[] args) {
if(args.size() == 0){
println "hello. $name"} else {
println "$args, $name"
}
}
こうしてみると、Object型の配列ということですね。すると先ほど示した実行結果で複数のパラメータを渡したときに角括弧で出力されていたのもうなずけるでしょう。
最後に
今回は関数についてみてきました。
定義の仕方はrubyやpythonとさほどかわりませんし、Javaとしてみてもそれほど違和感はないでしょう。ここまでくれば、すでにスクリプトとしては成立することができる程度のものを記述していくことができます。しかしrubyもpythonもクラス、オブジェクト指向を用いたプログラミングを可能にしています。それにJavaはオブジェクト指向プログラミング言語です。
ですから、Groovyでも一応そちらの話をしておくべきでしょう。
0コメント