groovy脚本绑定似乎没有运行

时间:2015-03-06 16:08:35

标签: groovy

虽然我喜欢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”参数是一个不起眼的功能(任何提示? - 读者没有文件的概念 - )

然后我的脚本实例中的绑定与我创建的绑定不同! (所以无法来回传递变量)

我需要使用我的脚本基类来调用我的脚本并将Binding和参数传递给它...如果有另一种方法可行,我会很高兴!谢谢!

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

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 个答案:

答案 0 :(得分:0)

  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])
    
  3. 您的示例输出不同Binding的原因是脚本初始化的方式。首先创建新的MyScript实例而不传递Binding,然后使用Binding设置GroovyShell中的setBinding

    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 构造函数中,Binding暂时不同。