如其他答案所述,Lua中的字符串连接运算符是两个点。
您的简单示例将被写成这样:
filename = "checkbook"
filename = filename .. ".tmp"
但是,需要注意一个重要的问题。由于Lua中的字符串是不可变的,每次连接都会创建一个新的字符串对象,并将源字符串的数据复制到其中。这使得对同一字符串进行连续连接的性能非常差。
在Lua中,可以采用如下习惯用法来解决这个问题:
function listvalues(s)
local t = { }
for k,v in ipairs(s) do
t[#t+1] = tostring(v)
end
return table.concat(t,"\n")
end
通过将要连接的字符串收集到一个数组t中,可以使用标准库例程table.concat将它们全部连接起来(以及在每对之间加上分隔符字符串),而不需要进行不必要的字符串复制。
更新:我刚刚注意到,我最初编写的代码片段使用的是pairs()而不是ipairs()。
如最初编写的那样,函数listvalues()确实会生成传入表中的每个值,但不是按照稳定或可预测的顺序。另一方面,它将包括键不是1到#s范围内的正整数的值。这就是pairs()的作用:它产生存储在表中的每个单独的(键、值)对。
在大多数情况下,您将使用类似于listvaluas()的东西来保留它们的顺序。因此,调用写为listvalues{13, 42, 17, 4}将生成一个包含那些值的字符串,并按照该顺序排列。但是,pairs()不会这样做,它将按某种取决于表数据结构的底层实现的顺序对它们进行分类。已知该顺序不仅取决于键,还取决于插入键和删除其他键的顺序。
当然,ipairs()也不是完美的答案。它只枚举表的那些形成“序列”的值。也就是说,那些键形成从1到某个上限的不间断块的值,这通常也是#运算符返回的值。(在许多情况下,函数ipairs()最好由一个简单的for循环取代,该循环只计数从1到#s。这是Lua 5.2和LuaJIT中的推荐做法,其中比ipairs()迭代器更有效地实现了更简单的for循环。)
如果pairs()确实是正确的方法,那么通常情况下,您希望打印键和值。通过使数据自描述,可以减少对顺序的担忧。当然,由于任何Lua类型(除了nil和浮点NaN)都可以用作键(而NaN也可以存储为值),因此找到字符串表示留给学生练习。还不要忘记树和更复杂的表结构。
Array.join(' ')
的方法,那么在Lua中可以用table.concat(table [, sep [, i [, j]]])
来实现。请注意,此函数会将表格中的元素连接成一个字符串,并使用可选的分隔符和起始/结束索引(默认是1和表格长度)。 - Dmitry Dmitriev