MissingMethodException при попытке Eval в Groovy - PullRequest
1 голос
/ 15 февраля 2012

Я пытаюсь динамически оценить результат другой функции во время вызова метода класса. Тем не менее, наличие и проблемы с областью применения Eval.

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 ]

2 голосов
/ 20 февраля 2012

Попробуйте это?

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 голосов
/ 15 февраля 2012

Я не думаю, что это возможно в текущей форме ... Лучшее, что я могу придумать, это использовать 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()
}

Если вы хотите, чтобы это выполнялось не как Script, а как скомпилированное приложение, возможно, есть маршруты, которые вы можете использовать с GroovyScriptEngine и / или GroovyShell . (См .: Оценка сценариев с общим базовым классом )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...