Groovy 仅在运行时才知道值的字符串插值

Groovy string interpolation with value only known at runtime

我觉得我在 Groovy 处理字符串的方式上遗漏了一些东西。我意识到它们是不可变的,但我想做的是在运行时插入一个值。我不知道怎么办。让我在 Python(如 "executable pseudo-code")中举一个非常简单的例子来说明我的意思。然后我会给出我在 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)
    }

我只是在想,也许有一种 groovier 的方法可以做到这一点。有人知道吗?谢谢!

您可以使用闭包:

class MyClass {

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

    MyClass() {
    }

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