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)
}
}
我觉得我在 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)
}
}