Lua编程时慎用字符串拼接

Lua中的字符串是非常不同的,它们全部是内置的(internalized),或者说是全局的,变量中存放的是字符串的地址,并且每个变量索引的都是全局的字符串,没有自己的存放空间。

例如下面的代码,为变量a和变量b设置了同样的内容的字符串"abc","abc"只有一份存在,a和b引用的是同一个:

local a = "abc"
local b = "abc"

如果要为a索引的字符串追加内容,那么会创建一个新的全局字符串:

a = "abc" .. "def"

创建全局字符串的开销是比较大的,在lua中慎用字符串拼接。

如果一定要拼接,将它们写入table,然后用table.contat() 连接起来,如下:

local t = {}
for line in io.lines() do
  t[#t + 1] = line
end

s = table.concat(t, "\n")