Lu中字符串的串联

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

其他语言的示例:

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

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

预先感谢您的帮助。

John Mark Mitchell asked 2020-01-17T18:14:51Z
4个解决方案
94 votes

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

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

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

如最初所写,函数pairs()确实会从传入的表中产生每个值,但不是以稳定或可预测的顺序。 另一方面,它将包括在nilNaN的范围内,其键不是正整数的值。这就是NaN所做的:它产生存储在表中的每个对(键,值)。

在大多数情况下,您将使用pairs()之类的东西,您可能会对保留其顺序感兴趣。 因此,写为nil的调用将产生一个包含该顺序值的字符串。 但是,NaN不会那样做,它将按照表数据结构的基础实现以某种顺序逐项列出它们。 众所周知,顺序不仅取决于键,而且还取决于插入键和移除其他键的顺序。

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

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

RBerteig answered 2020-01-17T18:15:56Z
17 votes

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

sbk answered 2020-01-17T18:16:16Z
7 votes

级联:

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

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

dcruz answered 2020-01-17T18:16:45Z
1 votes

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

我认为变量也是一样

Jambobond answered 2020-01-17T18:17:09Z
translate from https://stackoverflow.com:/questions/1405583/concatenation-of-strings-in-lua