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 }
いい感じにできてますね。