groovyのclosureについてメモ

クロージャと同じスコープの変数を参照できる

groovy:000> name = "taro"
===> taro
groovy:000> p = { println "Hello, ${name}" }
===> groovysh_evaluate$_run_closure1@647909a7
groovy:000> p()
Hello, taro
===> null
groovy:000> name = "hanako"
===> hanako
groovy:000> p()
Hello, hanako

こんな感じ。引数を囲むカッコはパラメータを渡すクロージャの場合は省略できる。

groovy:000> p = { name -> println "Hello, ${name}" }
===> groovysh_evaluate$_run_closure1@5e4aaf28
groovy:000> p("jiro")
Hello, jiro
===> null
groovy:000> p "saburo"
Hello, saburo
===> null 
  • パラメータを複数渡す

引数が足りないとエラー。多くてもエラー。

groovy:000> p = { n1,n2,n3 -> println "Hello,${n1} ${n2} ${n3}" }
===> groovysh_evaluate$_run_closure1@2e3f7cd9
groovy:000> p("john","paul","george")
Hello,john paul george
===> null
groovy:000> p("ringo")
ERROR groovy.lang.MissingMethodException: No signature of method: groovysh_evaluate$_run_closure1.doCall() is applicable for argument types: (java.lang.String) values: {"ringo"}
        at groovysh_evaluate.run (groovysh_evaluate:2)
        ...