Интерполяция строк 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)
}
}