像长注释/多行注释一样,可以使用一对双方括号来声明长字符串/多行字符串常量。被方括号括起来的内容可以包括很多行,并且内容中的转义序列不会被转义。此外,如果多行字符串中的第一个字符是换行符,那么这个换行符会被忽略。多行字符串在声明包含大段代码的字符串时非常方便,例如:
page = [[ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> Hello World </body> </html> ]] print(page)
有时字符串中可能有类似 a=b[c[i]]
这样的内容(注意其中的 ]]
),或者,字符串中可能有被注释掉的代码。为了应对这些情况,可以在两个左方括号之间加上任意数量的符号,如: [===[
。这样,字符串常量只有在遇到了包含相同数量等号的两个右方括号时才会结束(就前例而言,即 ]===]
)。 Lua
语言的语法扫描器会忽略所含等号数量不同的方括号。通过选择相当数量的等号,就可以在无需修改原字符串的情况下声明任意的字符串常量了。
对注释而言,这种机制也同样有效。例如:我们可以使用 --[=[
和 ]=]
来进行长注释,从而降低了对内部已经包含注释的代码进行注释的难度。
当代码中需要使用常量文本时,使用长字符串是一种理想的选择。但是,对于非文本的常量我们不应该滥用长字符串。虽然 Lua
语言中的字符串常量可以包含任意字节,但是滥用这个特性并不明智(例如,可能导致某些文本编辑器出现异常)。同时,像 "\r\n"
一样的 EOF
序列在被读取的时候可能会被归一化成 "\n"
。作为替代方案,最好就是把这些可能引起歧义的二进制数据用十进制数值或十六进制的数值转义序列进行表示,例如 "\x13\x01\xA1\xBB"
。不过,由于这种转义表示形成的字符串往往很长,所以对于长字符串来说仍可能是个问题。针对这种情况,从 Lua5.2
开始引入了转义序列 \z
,该转义符会跳过其后的所有空白字符,直到遇到第一个非空白字符。下例中演示了该转义字符的使用方法:
data = "\x00\x01\x02\x03\x04\x05\x06\x07\z \x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\"
第一行最后的 \z
会跳过其后的 EOF
和第二行的制表符,因此在最终得到的字符串中, \x08
实际上是紧跟着 \x07
的。