Czuję, że brakuje mi informacji o tym, jak Groovy obsługuje łańcuchy. Zdaję sobie sprawę, że są one niezmienne, ale chciałbym interpolować wartość w czasie wykonywania. Nie mogę zrozumieć, jak. Pozwól mi dać naprawdę prosty przykład w Pythonie (jako "wykonywalny pseudo-kod"), aby zilustrować, co mam na myśli. W takim razie dam to, co próbowałem w Groovy.Interpolacja z ciągiem Groovy o wartości znanej tylko w czasie wykonywania
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')
Powyższe wydruki: Witaj, Mario!
Groovy
// string_sample.groovy
class MyClass {
def greeting = "Hello, ${name}!"
MyClass() {
}
void sayHello(name) {
println greeting
}
}
m = new MyClass()
m.sayHello('Mario')
Powyższy skrypt Groovy skarży się, że nie jest znana name
:
Caught: groovy.lang.MissingPropertyException: No such property: name for class: MyClass
rozumiem, co się dzieje i dlaczego. Po prostu nie jestem pewien, co z tym zrobić. Zdaję sobie sprawę, że String.format
może być stosowany, który nie jest tak źle:
String greeting = "Hello, %s!"
// Omitted...
void sayHello(name) {
println String.format(greeting, name)
}
tylko myślę, że być może istnieje groovier sposób to zrobić. Ktoś wie? Dzięki!
Ach, dziękuję! Wiedziałem, że jest "groovier" sposób. Znalazłem kilka przykładów w sieci, które nawiązywały do zamknięć, ale nie mogłem tego rozgryźć. (Jestem nowy w używaniu ich.) Tyle tutoriali Groovy i przykładów, które uważam za zbyt skomplikowane, tak jak autor starał się spakować tak, jak mógł w jednym przykładzie. Rozumiem to teraz i lubię to. – Mario