当将一个列表(一个只有一个级别的表)转换为字符串时,是否有更高效但更简单的方法匿名函数?
为什么要问这个?我听说Lua中的字符串连接一遍又一遍内存效率低,因为Lua字符串是一次使用后必须抛出到垃圾收集器的不可变对象。
所以使用匿名函数使用我的意思是:
local resources = {
["bread"] = 20,
["meat"] = 5,
["something"] = 99
};
local function getTheText()
return "Resources:\n"..
( (function()
local s = "";
for k, v in pairs(resources) do
s = s.."\n\t"..k..": "..v.." units.";
end
return s;
)())..
"\nMore awesome info...";
end
end
你知道,这次我可以在这张桌子上使用一个元函数,就像 tostring 一样,因为它不会改变,但如果我使用其他匿名表我没有这个选项。
无论如何我喜欢匿名使用函数,所以对我来说这不是问题。
是否有更高效的不需要声明功能?这比使用metamethod更有效还是更低效?
答案 0 :(得分:3)
local function getTheText()
local temp = {"Resources:"}
for k,v in pairs(resources) do
temp[#temp + 1] = "\t"..k..": "..v.." units."
end
temp[#temp + 1] = "More Awesome info..."
return table.concat(temp, "\n")
end
table.concat
将有效地构建字符串并使用比通过s = s ..
连接更少的内存。