时髦的脚本绑定似乎不起作用



虽然我喜欢Groovy有时文档是...井简洁

我在将绑定传递给脚本时遇到问题。

这是代码:

def conf = new CompilerConfiguration()
Binding env = new Binding()
//....
env.setProperty( // some key and value set
//
conf.setScriptBaseClass(// name of class that is a Script
def shell = new GroovyShell(env,conf)
//isReader is the reader of the code// argz is an array of Strings
 shell.run(isReader, scriptName, argz)

好吧,首先,"run"中的"scriptname"参数是一个晦涩难懂的功能(任何提示?-读者没有文件的概念-)

那么我在脚本实例中获得的绑定与我创建的绑定不同!(所以无法来回传递变量)

我需要使用我的脚本基类调用我的脚本,并将绑定和参数传递给它......如果有另一种工作方式,我会很高兴!谢谢!

编辑。。。尝试设置示例:

package abcgroovy
abstract class MyScript  extends Script{
MyScript() {
    super()
    def _env = getBinding()
    println _env
}
    MyScript(Binding binding) {
        super(binding)
        def _env = binding
        println _env
    }
}

然后调用代码:

def conf = new CompilerConfiguration()
Binding env = new Binding()
println "ENV calling :$env"
conf.setScriptBaseClass("abcgroovy.MyScript")
def shell = new GroovyShell(env,conf)
Reader isReader = new StringReader("println 'hello world'")
// second argument: can't guess what to put
shell.run(isReader,'abcgroovy.MyScript',new String[0])

现在运行的结果:

ENV calling :groovy.lang.Binding@67a20f67
groovy.lang.Binding@6a192cfe
hello world
  1. 据我了解,第二个参数(fileName)是被解析的文件的名称。这与任何功能无关,但用于错误报告。因此,如果提供的脚本中有错误,则会在错误消息中使用fileName。因此,当您使用其他签名时,如果提供URIFile则无法指定该参数。

  2. 在您的示例中,实际使用了来自 GroovyShell 的Binding,您可以通过在实际脚本中打印Binding来验证。

    def conf = new CompilerConfiguration()
    Binding env = new Binding()
    println "ENV calling :$env"
    conf.setScriptBaseClass("abcgroovy.MyScript")
    def shell = new GroovyShell(env,conf)
    Reader isReader = new StringReader('println "binding in script: ${getBinding()}"')
    shell.run(isReader,'abcgroovy.MyScript',new String[0])
    

您的示例输出不同Binding的原因是脚本的初始化方式。首先创建一个新的MyScript实例而不传递Binding,然后使用 setBinding 设置来自GroovyShellBinding。不使用带有 Binding 参数的构造函数。

abstract class MyScript  extends Script {
    MyScript() {
        super()
        println "MyScript() with binding ${getBinding()}"
    }
    MyScript(Binding binding) {
        super(binding)
        // not invoked!
        println "MyScript(${binding})"
    }
    public void setBinding(Binding binding) {
        super.setBinding(binding)
        println "setBinding to ${binding}"
    }
}

示例输出

ENV calling :groovy.lang.Binding@335eadca
MyScript() with binding groovy.lang.Binding@45018215
setBinding to groovy.lang.Binding@335eadca
binding in script: groovy.lang.Binding@335eadca

请注意,绑定仅在MyScript()构造函数中暂时不同。

最新更新