【发布时间】:2009-11-15 18:04:15
【问题描述】:
我想将一小段代码从 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。
【问题讨论】:
标签: groovy metaprogramming eval porting