字符串在Lua中的连接

在许多语言中,您可以在变量赋值上连接字符串。我有一个场景,使用Lua编程语言,其中我需要将命令的输出附加到现有变量。在Lua中有一个功能等同于下面的例子?

其他语言示例:

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

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

预先感谢您的帮助。

解决方法

正如其他答案所说,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到#范围内的键的值不是正整数的值。这就是pairs():它生成存储在表中的每一个(键,值)对。

在大多数情况下,你会使用像listvaluas(),你会有兴趣保留他们的顺序。因此,写为listvalue {13,42,17,4}的调用生成一个包含该值的字符串。然而,pairs()不会这样做,它将以依赖于表数据结构的底层实现的某种顺序将它们逐项列举。已知该顺序不仅取决于键,而且取决于键的插入顺序和其他键的移除顺序。

当然,ipairs()也不是一个完美的答案。它只列举形成“序列”的表的那些值。也就是说,那些键的值形成一个从1到一些上限的不间断块,这通常也是#运算符返回的值。 (在许多情况下,函数ipairs()本身更好地替换为一个简单的循环,从1到#s。这是Lua 5.2和LuaJIT中的推荐做法,其中更简单的循环可以更有效地实现比ipairs()迭代器。)

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

相关文章

1.github代码实践源代码是lua脚本语言,下载th之后运行thmai...
此文为搬运帖,原帖地址https://www.cnblogs.com/zwywilliam/...
Rime输入法通过定义lua文件,可以实现获取当前时间日期的功能...
localfunctiongenerate_action(params)localscale_action=cc...
2022年1月11日13:57:45 官方:https://opm.openresty.org/官...
在Lua中的table(表),就像c#中的HashMap(哈希表),key和...