Lua中的字符串连接

117

在许多编程语言中,您可以在变量赋值时连接字符串。我有一个使用Lua编程语言的场景,需要将命令的输出附加到现有变量中。是否有与以下示例相当的Lua函数等效项?

其他编程语言的示例:

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

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

4
如果你是通过"Lua如何连接字符串"的请求访问本文章的,可以去谷歌搜索结果的第二个链接。如果你正在寻找类似于Ruby/JS中的Array.join(' ')的方法,那么在Lua中可以用table.concat(table [, sep [, i [, j]]])来实现。请注意,此函数会将表格中的元素连接成一个字符串,并使用可选的分隔符和起始/结束索引(默认是1和表格长度)。 - Dmitry Dmitriev
5个回答

183
如其他答案所述,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也可以存储为值),因此找到字符串表示留给学生练习。还不要忘记树和更复杂的表结构。

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

28

如果你在询问运算符..是否有简写版本,那么答案是否定的。你不能写成a ..= b,你必须完整地输入:filename = filename .. ".tmp"


10

字符串连接:

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

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


6
在其他语言中,您会使用:
// C#

string a = "Hello";

// 2 Options
a = a + " World!";

// or the easier way:
a += " World!";

现在在Lua中:你可以使用..,例如:

-- Lua

local a = "Hello"

-- Sadly Lua doesn't have += so you have to do it this way.
a = a.." World!";

3

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

我认为变量也是如此。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接