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