1

如果我像这样运行 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 返回的“脚本”对象不像闭包——但我不想更改第二个字符串的语法——如果我做了会有很多解决方案......

有任何想法吗?

编辑:写完这篇文章后,我意识到可以简单地将两个字符串连接起来并解析一次,所以每次我想运行一个使用 square() 函数的脚本时,我都必须在前面加上文本“def square (x){x*x)\n" 到脚本...

我可以做到这一点,但它似乎有点古怪,所以我仍然对其他答案持开放态度。

4

1 回答 1

1

很接近!

您需要使用evaluate而不是解析来从 GroovyShell 获取闭包以作为变量传递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 )
}
于 2012-10-29T23:24:16.080 回答