2015-03-11 8 views
8

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!

Odpowiedz

9

Można użyć Zamknięcie:

class MyClass { 

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

    MyClass() { 
    } 

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

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

Powiązane problemy