No Programming, No Life

プログラミング関連の話題や雑記

Groovyでクロージャによって、渡す引数を変化させるメソッド

GroovyのMap#eachでは、渡すクロージャが取る引数の数によって受け取る内容が変わる。
(動作確認: Groovy Version: 1.5.7 JVM: 1.6.0_10)

map#eachの例

def map = [a:1, b:2, c:3]

// 引数1つの時はプロパティとして
def list1 = []
map.each{ list1 << "${it.key}=${it.value}" }
assert ['a=1', 'b=2', 'c=3'] == list1

// 引数2つの時は1つ目がキー、2つ目が値
def list2 = []
map.each{ key, value -> list2 << "${key}=${value}" }
assert ['a=1', 'b=2', 'c=3'] == list2

クロージャによって、渡す引数を変化させるメソッド

ということで、自分でこのような機能を有するメソッドを作ってみた。以下のような感じでいいのかな?

def selectCallClos(Closure clos) {
   // パラメータタイプの数で呼び分け
   switch (clos.parameterTypes.size()) {
      case 2:
         return clos.call(10, 20) // intを2つ渡す
         break
      case 1:
         return clos.call('abc') // Stringを1つ渡す
         break;
   }
}

assert 30 == selectCallClos{ x, y -> x + y }
assert 'abcabcabc' == selectCallClos{ str -> str * 3 }

いい感じにできてますね。