如果我运行这样的GroovyScript:
def gs=new GroovyShell()
gs.setVariable('square',{x->x*x})
gs.evaluate("print square(10)")
它运作得很好。问题是我想要编译“Square”函数。我试过这个:
def gs=new GroovyShell()
gs.setVariable('square',gs.parse("{x->x*x}"))
gs.evaluate("print square(10)")
但它不起作用,我很确定这是因为gs.parse返回的“Script”对象 不像闭包那样 - 但我不想改变第二个字符串的语法 - 如果我这样做会有很多解决方案......
有什么想法吗?
编辑: 写完之后我意识到可以简单地连接两个字符串并解析它们一次,所以每次我想运行一个使用square()函数的脚本时,我必须在前面加上文本“def square(x ){x * x)\ n“到剧本......
我能做到这一点,但看起来有点松懈,所以我仍然愿意接受其他答案。
答案 0 :(得分:1)
非常接近!
您需要使用evaluate
而不是解析来从GroovyShell返回Closure以作为变量square
传递:
def gs=new GroovyShell()
gs.setVariable( 'square', gs.evaluate( '{ x -> x * x }' ) )
gs.evaluate( 'print square(10)' )
发现这有点酷,并且被带走了......你可以像这样依赖彼此关闭:
def varMap = [
square: '{ x -> x * x }',
pyth: '{ x, y -> Math.sqrt( square( x ) + square( y ) ) }'
]
// Create a map of name->Closure set each into the shell
// in turn, so later Closures can depend on earlier ones in
// the list
varMap = new GroovyShell().with { shell ->
varMap.collectEntries { name, func ->
// Get the closure
def fn = shell.evaluate( func )
// Set it into this current shell
shell.setVariable( name, fn )
// And return the Entry name->Closure
[ (name): fn ]
}
}
// Ok, this is what we want to run
def command = 'println pyth( 3, 4 )'
new GroovyShell().with { shell ->
// Set all the vars up
varMap.each { name, fn ->
shell.setVariable( name, fn )
}
// Then run the command
shell.evaluate( command )
}