1

私はGroovyベースのツールを構築しており、インタラクティブなコマンドラインを提供したいアドインとして、これは部分的に機能していますが、バインディングはGroovyShell.evaluate()呼び出し間で状態を維持しません。Groovyのドキュメントを確認しました。またInteractiveGroovyShell、バージョン2.0.xでは使用できないというクラスを使用した例があります。

この機能を実現するために通常のGroovyシェルを構成する方法はありますか?

これが私が今グルーヴィーなシェルを作成している方法の単純化されたバージョンです:

CompilerConfiguration config = new CompilerConfiguration();
Binding binding = new Binding();
shell = new GroovyShell(binding, config);
shell.evaluate("def a = 20");
shell.evaluate("println a"); //this throws an exception telling the variable does not exist
4

2 に答える 2

1
shell.evaluate("def a = 20");

代わりにdef a = 20必要なのはa = 20。各evaluate呼び出しは個別のスクリプトを解析およびコンパイルし、宣言(defなどの明示的な型を使用するかどうかに関係なくint a = 20)はその特定のスクリプトのローカル変数になり、バインディングには何も格納しません。がないdefと、宣言されていない変数への単純な割り当てがあります。これはバインディングに入り、後のevaluate呼び出しで表示されます。

于 2013-01-08T19:54:18.330 に答える
0

binding異なるシェルに同じものを再利用する必要があります。バインディング自体は状態を維持します:

import org.codehaus.groovy.control.CompilerConfiguration

def binding = new Binding()
def shell = new GroovyShell(binding)

shell.evaluate("a = 5")
assert binding.variables == [a:5]

shell.evaluate("println a; b = 6")
assert binding.variables == [a:5, b:6]

def shell2 = new GroovyShell(binding)

// even in a new shell the binding keep the state
shell2.evaluate("c = 7")
assert binding.variables == [a:5, b:6, c:7]

グルーヴィーな2.0.5で働いた

于 2013-01-08T15:21:07.730 に答える