2012-02-13 4 views
0

${somethingElse}が入っているテキストが表示されていますが、これは通常の文字列です。

私はクラスを持っている:

class Whatever { 

    def somethingElse = 5 

    void action(String sth) { 
     def test = [] 
     test.testing = sth 
     assert test.testing == 5 

    } 
} 

はグルーヴィーで、それは可能ですか?

EDIT:

私のシナリオは次のとおりです。私のアプリケーションでいくつかの他の値を指している値を持つノードが含まれている負荷のxmlファイル、。だから私はshell.setVariable("current", myClass)を持っているとしましょう。そして今、私のXMLで、${current.someField}を値にしたいと思っています。 問題は、xmlの値が文字列であり、簡単に評価できないということです。 これらの「値」がユーザーによってどのように作成されるのか予測できません。少数のクラスを使用することができます。

xmlファイルがロードされたときに変換できません。特定のケースで使用するため、「オンデマンド」でなければなりません。その瞬間に値を使用できるようにしたいときxmlファイルが読み込まれます。

ヒント?あなたができる

答えて

0

、私たちが何をしたか、XMLでこのフォーマットを使用しました。 Insane。それは多くの時間と多くの記憶を必要としました。

は、最終的に我々は評価できるようにしたかった各文字列のためにオリジナルのものとcratedスクリプトにフォーマットを変更:

stringToParse = "Hello world @ ${System.currentTimeMillis()}!!" 

はその後、我々が呼ぶことができた

Script script = shell.parse("\""+stringToParse+"\"") 

をscript.run()を何度も実行してみてください。 実際にはまだありません。

2

一つのことがある:

normalText#codeToExecuteOrEvaluate#normalText 

と正規表現とgroovyShell.evaluate()コードにreplaceクロージャを使用:まず

class Whatever { 

    def somethingElse = 5 

    void action(String sth) { 
    def result = new groovy.text.GStringTemplateEngine().with { 
     createTemplate(sth).make(this.properties).toString() 
    } 
    assert result == "Number 5" 
    } 
} 

// Pass it a String 
new Whatever().action('Number ${somethingElse}') 
+0

これはオーバーヘッドのようです。私たちはシェルを使用してバインディングを設定することを考えましたが、それは過剰なもののようにも見えました。 – Krystian

+0

ええ、私が考えることのできるもう1つの方法は、 'GroovyShell'を使って' Bindings'を渡すことです...あなたが許可された入力をより詳細に制御できるという利点があると思います... 'Eval.XXX'が勝ちましたあなたはあなたが求められる変数を知らないので、仕事はしません。:-( –

関連する問題