微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

字符串在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也可以存储为值),因此找到字符串表示作为对学生的练习。并且不要忘记树和更复杂的表结构。

原文地址:https://www.jb51.cc/lua/274798.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐