OpenResty完全开发指南:构建百万级别并发的Web应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.4 字符串

Lua可以高效地处理字符串,几KB或者几MB的长字符串也不会对效率造成影响,可以放心地使用字符串存储大块的数据。

定义

Lua的字符串形式非常灵活,单引号或者双引号都可以,字符串里也允许使用转义符:

print('openresty')               -- 单引号形式的字符串
print("It's OK")                 -- 双引号形式的字符串,里面可以包含单引号
print("lua\tnginx")              -- 使用转义字符\t

Lua还用“[[...]]”的形式支持raw string,括号内的字符不会转义,在写正则表达式或者字符串里有引号、斜线的时候非常方便:

print([[raw string \r\n]])         -- 字符串里的\r\n等不会被转义
print([[^\d+.\d+$]])               -- 直接是字符串的“原始形态”
print([["", '', ""]])              -- 引号无须转义

与多行注释类似,“[[...]]”的形式也支持在括号中间插入“=”,而且如果“[[”后面是一个换行,那么Lua会自动忽略这个换行,在书写大量文字时是个非常方便的特性:

x = [=[                           -- 这里的换行符不会包含在字符串里
[[no \r\n, just one line]]        -- 但这里的换行符属于字符串!
]=]                               -- 字符串定义结束,等号数量必须匹配

特点

Lua里的字符串更准确地说应该是“字节序列”,不仅可以包含可见字符,还能够包含任意的二进制数据。

Lua字符串的另外一个特点是只读的,字符串对象一旦创建出来后就不能再做修改,如果要变动字符串(比如更改里面的某些字符)就只能用其他方式生成一个新的拷贝。

Lua语言在内部使用一个全局散列表来管理所有的字符串,所以多个相同的字符串不会占用多份内存,而且字符串的相等比较成本很低,不需要逐个检查里面的字符,而是直接比较两者的散列值。