Я бы хотел портировать небольшой кусочек кода с 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)
Я использую Groovy 1.6.5.