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

只有在运行时才知道值的Groovy字符串插值,groovy,Groovy,我觉得Groovy在处理字符串方面缺少了一些东西。我意识到它们是不可变的,但我想做的是在运行时插入一个值。我不知道怎么做。让我用Python给出一个非常简单的示例(作为“可执行伪代码”)来说明我的意思。然后我将给出我在Groovy中尝试过的东西 Python # string_sample.py class MyClass(object): greeting = 'Hello, %s!' def __init__(self): object.__init_

我觉得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
未知:

catch:groovy.lang.MissingPropertyException:没有这样的属性:类的名称:MyClass

我知道发生了什么,为什么。我只是不知道该怎么办。我意识到可以使用
String.format
,这并不坏:

    String greeting = "Hello, %s!" 

    // Omitted...

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

我只是在想也许有一种更棒的方法。有人知道吗?谢谢

您可以使用闭包:

class MyClass {

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

    MyClass() {
    }

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

啊,谢谢你!我知道有一种“更棒”的方式。我在网上找到了一些暗指闭包的例子,但我想不出来。(我对使用Groovy很陌生。)我发现很多Groovy教程和示例对我来说都太复杂了,就像作者试图在一个示例中尽可能多地添加内容一样。我现在明白了,我喜欢它。我只想说我喜欢你重复OP类的方式,除了实现闭包所需的微小变化。也许这是一件简单的事情,但在我看来,这在教学上是完美的。@msouth这样的评论让我的一天变得有意义,让这一切变得值得