Интерполяция строк Groovy со значением, известным только во время выполнения

Я чувствую, что мне чего-то не хватает с тем, как Groovy обрабатывает строки. Я понимаю, что они неизменяемы, но я хотел бы интерполировать значение во время выполнения. Я не могу понять, как. Позвольте мне привести очень простой пример на Python (как "исполняемый псевдокод"), чтобы проиллюстрировать, что я имею в виду. Тогда я отдам то, что пробовал в Groovy.

Python

# string_sample.py 

class MyClass(object):

    greeting = 'Hello, %s!'

    def __init__(self):
        object.__init__(self)

    def sayHello(self, name):
        print self.greeting % name


if __name__ == '__main__':
    m = MyClass()
    m.sayHello('Mario')

выше принты: Привет, Марио!

в Groovy

// string_sample.groovy

class MyClass {

    def greeting = "Hello, ${name}!"

    MyClass() {
    }

    void sayHello(name) {
        println greeting
    }
}

m = new MyClass()
m.sayHello('Mario')

выше Groovy скрипт жалуется, что name неизвестно:

Caught: groovy.lang.MissingPropertyException: No such property: name for class: MyClass

Я понимаю, что происходит и почему. Я просто не знаю, что с этим делать. Я понимаю, что String.format можно использовать, что не так уж и плохо:

    String greeting = "Hello, %s!" 

    // Omitted...

    void sayHello(name) {
        println String.format(greeting, name)
    }

Я просто думаю, что, может быть, есть Groovy и способ сделать это. Кто-нибудь знает? Спасибо!

1 ответов


вы можете использовать замыкание:

class MyClass {

    def greeting = { name -> "Hello, ${name}!" }

    MyClass() {
    }

    void sayHello(name) {
        println greeting(name)
    }
}