2012-02-15 3 views
1

クラスメソッド呼び出し中に別の関数の結果を動的に評価しようとしています。しかし、Evalの範囲を持ち、問題を提起する。GroovyでEvalしようとするとMissingMethodExceptionが発生する

class A { 
    private String a 
    public A() { 
     a = 5 
    } 

    public whatIsA() { 
     return a 
    } 


    public func() { 
     return "\\${whatIsA()}" 
    } 

    public test() { 
     return Eval.me("\"\${func()}\"") 
    } 
} 
def a = new A() 
a.test() 



Exception thrown: groovy.lang.MissingMethodException: No signature of method: Script1.func() is applicable for argument types:() values: {} 

groovy.lang.MissingMethodException: No signature of method: Script1.func() is applicable for argument types:() values: {} 
    at Script1.run(Script1.groovy:1) 
    at A.test(Script7:17) 
    at Script7.run(Script7:22) 

どのようにしてAクラスのインスタンスのスコープをEvalスクリプトに渡すことができますか?私はそれが現在の形で可能だとは思わない

答えて

2

試してみてください。

class A { 
    private String a 
    public A() { 
     a = 5 
    } 

    public whatIsA() { 
     return a 
    } 

    public func() { 
     return "${whatIsA()} + 5" 
    } 

    public test() { 
     return Eval.me(func()) 
    } 
} 
def a = new A() 
a.test() 
+0

eval/evalの代わりにEval.meを使用すると、うまくいきました。ありがとう! – frmdstryr

0

...私が思い付くことができる最高はそうのようなEval.xを使用するかを次のようになります。

public test() { 
    return Eval.x(this, '"${x.func()}"') 
} 

あるいは閉鎖に式をラップ(どのあなたは、これはスクリプトとしてではない実行したい場合は、上の委任)

public test() { 
    def clos = Eval.me('{ -> func() }') 
    clos.delegate = this 
    clos.resolveStrategy = Closure.DELEGATE_ONLY 
    clos.call() 
} 

を変更することができますが、コンパイルされたアプリケーションとして、あなたはGroovyScriptEngineおよび/またはGroovyShellを取ることができますルートは、おそらくあります。 (Evaluate Scripts with a Common Base Classを参照してください)

関連する問題