其他语言示例:
===== PERL ===== $filename = "checkbook"; $filename .= ".tmp"; ================ ===== C# ===== string filename = "checkbook"; filename += ".tmp"; ===============
预先感谢您的帮助。
解决方法
你的简单示例将是这样写的:
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也可以存储为值),因此找到字符串表示作为对学生的练习。并且不要忘记树和更复杂的表结构。