Lua中字符串的串联


70

在许多语言中,您可以在变量分配上连接字符串。我有一个使用Lua编程语言的场景,我需要将命令的输出附加到现有变量中。Lua中是否有与以下示例等效的功能?

其他语言的示例:

===== PERL =====
$filename = "checkbook";
$filename .= ".tmp";
================

===== C# =====
string filename = "checkbook";
filename += ".tmp";
===============

预先感谢您的帮助。


1
对于那些通过“ Lua如何加入字符串”访问本文的人,请提供Google的第二个链接。谁在寻找Array.join(' ')Ruby / JS模拟。它table.concat(table [, sep [, i [, j]]])在Lua中。
德米特里·德米特里耶夫

Answers:


119

正如其他答案所说,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

通过将要连接的字符串收集到数组中ttable.concat可以使用标准库例程将它们全部连接在一起(以及每对之间的分隔符字符串),而不必复制字符串。

更新:我刚刚注意到我最初是使用pairs()而不是编写上面的代码片段ipairs()

如最初所写,该函数listvalues()确实会从传入的表中产生每个值,但不会以稳定或可预测的顺序进行。另一方面,它将包含在1to的范围内谁的键不是正整数的值#s。那就是pairs()它的作用:它将产生存储在表中的每个(键,值)对。

在大多数情况下,您可能会喜欢使用某些东西listvaluas()来保持其顺序。因此,编写为的调用listvalues{13, 42, 17, 4}将产生一个包含该顺序值的字符串。但是,pairs()不会那样做,它将按照表数据结构的基础实现以某种顺序逐项列出它们。众所周知,顺序不仅取决于键,而且还取决于插入键和移除其他键的顺序。

当然ipairs()也不是一个完美的答案。它只枚举表格中构成“序列”的那些值。也就是说,那些键值构成了一个连续的块,范围从1到某个上限,(通常)也是#运算符返回的值。(在许多情况下,函数ipairs()本身最好用一个简单的for循环代替,该循环仅从1到进行计数#s。这是Lua 5.2和LuaJIT中的推荐做法,在该实践中,foripairs()迭代器相比,更简单的循环可以更有效地实现。)

如果pairs()确实是正确的方法,那么通常情况下您希望同时打印键和值。通过使数据自描述,这减少了对顺序的担忧。当然,由于任何Lua类型(除了nil和浮点数NaN)都可以用作键(NaN也可以将其存储为值),因此查找字符串表示形式留给学生作为练习。并且不要忘记树木和更复杂的桌子结构。


定义递归表时,table.concat无法正常工作。例如:T = {1,2,3}; T [4] = T会在表'concat'的索引4处引发错误'无效值(表)
-piotao

20

如果您要问是否有运营商的简写版本..-不,没有。你不会写a ..= b。您必须完整输入:filename = filename .. ".tmp"


8

级联:

Lua中的字符串连接运算符由两个点('..')表示。如果两个操作数都是字符串或数字,则根据第2.2.1节中提到的规则将它们转换为字符串。否则,将调用“ concat”元方法(请参见第2.8节)。

来自:http : //www.lua.org/manual/5.1/manual.html#2.5.4


1

可以使用串联运算符“ ..”将字符串连接在一起。

我认为变量也是一样

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.