RubyからGroovyに小さなコードを移植したいのですが、これで行き詰まります。
def given(array,closure) {
closure.delegate = array
closure()
}
given([1,2,3,4]) {
findAll { it > 4}
}
今、それはこのメッセージで死にます:
Exception thrown: Cannot compare ConsoleScript0$_run_closure1 with value 'ConsoleScript0$_run_closure1@1e6743e' and java.lang.Integer with value '4'。
クロージャのデリゲートを配列に設定しようとしましたが、findAllメソッドでは、配列の実際のアイテムではなく、クロージャを表しているようです。私もこのようにクロージャーを実行しようとしました:
array.with {
closure(array)
}
しかし、私はまだそれを機能させることができませんでした。何がうまくいくかについて何か考えはありますか?Rubyに相当するのinstance_evalは、配列のコンテキストでのクロージャーです。
編集:Mykolaのコードを実行すると、次の出力が生成されました:
given [1, 2, 3, 4]
class Demo$_main_closure1
2
Exception thrown: Cannot compare Demo$_main_closure1 with value 'Demo$_main_closure1@fe53cf' and java.lang.Integer with value '2'
groovy.lang.GroovyRuntimeException: Cannot compare Demo$_main_closure1 with value 'Demo$_main_closure1@fe53cf' and java.lang.Integer with value '2'
at Demo$_main_closure1_closure2.doCall(ConsoleScript3:15)
at Demo$_main_closure1.doCall(ConsoleScript3:15)
at Demo$_main_closure1.doCall(ConsoleScript3)
at Demo.given(ConsoleScript3:28)
at Demo$given.callStatic(Unknown Source)
at Demo.main(ConsoleScript3:12)
Groovy1.6.5を実行しています。