在Groovy中使用"$"

59

我看到{ }被用作闭包,当在大括号前面加上$时,它就是在字符串中执行变量替换。我找不到关于$符号的文档,很难搜索到,而且Groovy字符串文档也没有介绍这个。请问您可以指向文档和/或解释Groovy中"$"操作符吗?它的所有用法都有哪些?Grails是否在Groovy基础上进行了扩展?

4个回答

64

GString(Groovy字符串)中,任何有效的 Groovy 表达式都可以用 ${...} 包含,包括方法调用等。

详情请参见该页面


感谢指出这是在GString部分。String部分在其中一个示例中使用了${},但没有进行介绍。 - Ray
2
我从未想到在GString中可以做这么多。 - nburr
4
有一种预防措施可能会被一些人忽略,就是使用双引号来使其有效,例如 'Hello ${varSam}' 将不起作用,但是 "Hello ${varSam}" 可以。 - old-monk

52

Grails不会在Groovy之外扩展$的用法。以下是$的两个实际用途:

字符串插值

在GString中,您可以使用$而不需要{}来计算属性路径,例如:

def date = new Date()
println "The time is $date.time"
如果您想计算一个比属性路径更复杂的表达式,您必须使用${},例如:
println "The time is ${new Date().getTime()}"

动态代码执行

动态访问属性

def prop = "time"
new Date()."$prop"

动态调用方法

def prop = "toString"
new Date()."$prop"()

正如评论中所指出的那样,这实际上只是字符串内插的一种特殊情况,因为下面的方式也是有效的

new Date().'toString'()

1
你的第二个用法不就是第一个用法的例子吗?因为你可以通过它们的字符串名称调用方法,比如 new Date().'toString'()。所以第一个用法只是构建一个字符串,然后用它来访问方法/属性的情况。 - tim_yates
1
@tim - 你说得对,我想我真正展示的是字符串插值的两个实际用法,而不是$的两个用法。我会尽力让这更清晰。 - Dónal
我给你点赞 :-) 抱歉我有点追求严谨,因为这是一个很好的例子,说明了 $ 的真正用处。 - tim_yates
很酷 - 谢谢你展示了动态访问属性和动态调用方法的例子。 - Ray
我也想将你的回答标记为答案,或者提高分数,但系统不允许我这样做。感谢您对Grails的解释和示例。 - Ray
如果包含$variable的字符串来自数据库的选择,它能工作吗? - andQlimax

11

$ 在 Groovy 中不是运算符。在字符串替换中,它用于标识字符串内的变量 - 这里没有什么魔法。这是许多模板和编程语言中用于内联变量的常见格式。

所有特殊的 Groovy 运算符都在此处列出:http://groovy-lang.org/operators.html


1
在流水线中的Jenkins文件中工作。 在此输入图片描述
#!/usr/bin/env groovy
node{
          stage ('print'){
             def DestPath="D\$\\"
             println("DestPath:${DestPath}")
          }
}

不起作用。Jenkins 抱怨“def”。 - Regis May

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接