2013-09-03 2 views
0

Есть ли способ ссылаться на переменные динамически, как методы? Here является Groovy пример ссылки метод динамически:Получить динамически динамически

class Dog { 
    def bark() { println "woof!" } 
    def sit() { println "(sitting)" } 
    def jump() { println "boing!" } 
} 

def doAction(animal, action) { 
    animal."$action"()     //action name is passed at invocation 
} 

def rex = new Dog() 

doAction(rex, "bark")    //prints 'woof!' 
doAction(rex, "jump")    //prints 'boing!' 

... Но делать что-то вроде этого не работает:

class Cat { 
    def cat__PurrSound__List = ['a', 'b', 'c'] 
    def cat__MeowSound__List = [1, 2, 3] 

    def someMethod(def sound) { 
     assert sound == "PurrSound" 

     def catSoundListStr = "cat__${obj.domainClass.name}__List" 
     assert catSoundListStr = "cat__PurrSound__List" 

     def catSoundList = "$catSoundListStr" 
     assert catSoundList == cat__PurrSound__List // fail 
    } 
} 
+0

'assert foo. '$ SomeMethod"() == "asdf" 'не будет работать, так как у вас нет переменной var, называемой' someMethod' –

+0

@tim_yates Кажется, что я отлично работаю в своем тесте Grails. Я использовал его как пример [здесь] (http://groovy.codehaus.org/Dynamic+Groovy), который использует '$ action'. – ubiquibacon

+0

Что заставляет использовать '' $ foo'' вместо 'foo'? – dmahapatro

ответ

2

Да, так что вы можете сделать:

def methodName = 'someMethod' 
assert foo."$methodName"() == "asdf" // This works 

и получить объект по имени, вы можете сделать (по крайней мере, в скрипте):

// Cannot use `def` in a groovy-script when trying to do this 
foo = new Foo() 

def objectName = 'foo' 
assert this."$objectName".someMethod() == "asdf" 
+0

Awesome. Работает и в Grails. – ubiquibacon

+0

'this." $ ObjectName ".someMethod()', похоже, не работает. – dmahapatro

+0

@dmahapatro Что вы используете? Это очень зависит от контекста, относительно того, будет ли объект найден в 'this' –

Смежные вопросы