虽然我喜欢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
答案 0 :(得分:0)
根据我的理解,第二个参数(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
,然后使用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暂时不同。