正如其他答案所说,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
to的范围内谁的键不是正整数的值#s
。那就是pairs()
它的作用:它将产生存储在表中的每个(键,值)对。
在大多数情况下,您可能会喜欢使用某些东西listvaluas()
来保持其顺序。因此,编写为的调用listvalues{13, 42, 17, 4}
将产生一个包含该顺序值的字符串。但是,pairs()
不会那样做,它将按照表数据结构的基础实现以某种顺序逐项列出它们。众所周知,顺序不仅取决于键,而且还取决于插入键和移除其他键的顺序。
当然ipairs()
也不是一个完美的答案。它只枚举表格中构成“序列”的那些值。也就是说,那些键值构成了一个连续的块,范围从1到某个上限,(通常)也是#
运算符返回的值。(在许多情况下,函数ipairs()
本身最好用一个简单的for
循环代替,该循环仅从1
到进行计数#s
。这是Lua 5.2和LuaJIT中的推荐做法,在该实践中,for
与ipairs()
迭代器相比,更简单的循环可以更有效地实现。)
如果pairs()
确实是正确的方法,那么通常情况下您希望同时打印键和值。通过使数据自描述,这减少了对顺序的担忧。当然,由于任何Lua类型(除了nil
和浮点数NaN
)都可以用作键(NaN
也可以将其存储为值),因此查找字符串表示形式留给学生作为练习。并且不要忘记树木和更复杂的桌子结构。
Array.join(' ')
Ruby / JS模拟。它table.concat(table [, sep [, i [, j]]])
在Lua中。