メソッドへの引数の与え方

Javaと異なり,Groovyの場合,メソッドの引数の指定方法は二通り存在する.一つはJavaと同様に引数を列挙するやり方.もう一つはMapを使うやり方である.まず引数を列挙するやり方は以下の通りである.

//g1.groovy
func "aaa","bbb" //二つの引数を持ったメソッドを呼出す

def func(arg1,arg2){ //二つの引数を持ったメソッドを定義
  println "arg1:${arg1}"
  println "arg2:${arg2}"
}
//end
  

Mapを使うと以下のようになる.

//g1.groovy
func "aaa","bbb" //二つの引数を持った関数を呼出す
println "---------------------"
func arg1:"aaa",arg2:"bbb" //Mapとして引数を渡す

def func(arg1,arg2){ //二つの引数を持ったメソッドを定義
  println "arg1:${arg1}"
  println "arg2:${arg2}"
}

def func(args){ //一つのMap型の引数を持ったメソッドを定義
  println "args.arg1:${args.arg1}"
  println "args.arg2:${args.arg2}"
}
//end
  

もし,引数が一つしかないメソッドを使おうとした場合,Map型の引数を持ったメソッドと引数の数が同じとなる.そのままでは,二つのメソッドを定義することはできない.そこで,引数の型を指定する.

//g1.groovy
func "aaa","bbb" //二つの引数を持った関数を呼出す
println "---------------------"
func arg1:"aaa",arg2:"bbb" //Mapとして引数を渡す
println "---------------------"
func "aaa" //Mapも引数が一つなので,混乱する

def func(arg1,arg2){
  println "arg1:${arg1}"
  println "arg2:${arg2}"
}

def func(args){ //こっちに明示的にMapを指定しても良い.両方に型を指定しても良い
  println "args.arg1:${args.arg1}"
  println "args.arg2:${args.arg2}"
}

def func(String arg1){ //明示的に引数の型(String)を指定する
  func arg1,null
}
//end
  

クラスを使用しても,やり方は同じである.

class Foo{
  void func(arg1,arg2){
    println "arg1:${arg1}"
    println "arg2:${arg2}"
  }

  void func(args){
    println "args.arg1:${args.arg1}"
    println "args.arg2:${args.arg2}"
  }

  void func(String arg1){ //明示的に引数の型(String)を指定する
    func arg1,null
  }

  static void main(args){
    foo=new Foo()
    foo.func "aaa","bbb"
    println "---------------------"
    foo.func arg1:"aaa",arg2:"bbb"
    println "---------------------"
    foo.func "aaa"
  }
}
  

なお,動作環境は以下の通りである.

  • Groovy 1.0 beta7
  • JDK 1.4.2_04
  • Windows XP Professional Service Pack1