字符串2

斜杠字符串

还有一种不需要添加额外的反斜杠转义符的字符串表示方法,在表达正则表达式和windows文件/目录名时使用它会显得格外方便。

def s = /.*foo.*/
def dirname  = /^.*\//
def basename = /[^\/]+$/

斜杠字符串只支持\/的转义(在字符串中插入一个斜杠)。这会导致一个问题,就是你将不能直接在斜杠字符串的末尾添加反斜杠(否则Groovy会以为你想对结尾换行符进行转义,以至于认为该字符串还没有结束)。作为替代,可以使用:def bs = '\\\\'; def winpath=/C:\windows\system32$bs/ 或者 def winpath=/C:\windows\system32\${}/。

另外一个注意事项:不要试图使用空的斜杠字符串:def x = / /, 这两个斜杠会被解释成行注释符,而 def z = /${}/ 则不会有问题。

最后一个注意事项:当前,当使用assert断言语句并省略了括号时,斜杠字符串不能出现在该断言表达式的左手边(LHS),例如:

assert 'ab' == 'a' + 'b'    // OK, 没有出现斜杠字符串
assert 'a' + 'b' == /ab/    // OK, 斜杠字符串在右手边
assert (/ab/ == 'a' + 'b')  // 斜杠字符串出现在断言表达式的左手边时,括号是必须的,至少目前是这样

这是当前语法的一个特性,倒不是期望的目标,也许有一天可以移除这个语法——这是语法中一个令人难以捉摸的边界情况。

更多的例子,请查看 正则表达式

字符串是不可变的

这个特性可以从下面两个代码片段中看出,你可以复制粘贴到groovyConsole中运行:

st = ["status":"test"]
sn = st
println sn
st.status = "tset"
println sn

上面的两个变量都是 map 的引用。

如果你对字符串做同样的事情,行为则是不一样的:

st = "test"
sn = st
println sn
st = "tset"
println sn

下面是 Guillaume Laforge 的解释:

在第一个例子中,sn 和 st 都指向内存中的同一个map对象,但是在第二个例子中,到了最后,st 指向了内存中的另一个新的不可变的字符串对象。

更多的例子

下面的例子通过了测试:

aaa = '"bread","apple","egg"'
items = aaa.split(',')
assert items[1] == '"apple"'
items.each{ println "item: $it" }

输出:

item: "bread"
item: "apple"
item: "egg"
 
 
test/groovy_test2.txt · 最后更改: 2008-08-13 21:43 由 samson
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki