虽然我喜欢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
-
据我了解,第二个参数(
fileName
)是被解析的文件的名称。这与任何功能无关,但用于错误报告。因此,如果提供的脚本中有错误,则会在错误消息中使用fileName
。因此,当您使用其他签名时,如果提供URI
或File
则无法指定该参数。 -
在您的示例中,实际使用了来自 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
设置来自GroovyShell
的Binding
。不使用带有 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()
构造函数中暂时不同。