【问题标题】:Lua table/list string cast/concatLua 表/列表字符串强制转换/concat
【发布时间】:2016-07-21 15:44:41
【问题描述】:

在将列表(只有一层的表)转换为字符串时,有没有比匿名函数更高效但更简单的方法?

为什么要问这个?我听说 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

你知道,这次我可以在这张桌子上使用 a 元函数,比如 tostring,因为它不会改变,但如果我使用其他 匿名表我不会有这个选项。

无论如何,我喜欢函数的匿名使用,所以这对我来说不是问题。


还有什么更高效的不需要需要声明函数吗?这比使用元方法效率更高还是更低?

【问题讨论】:

  • 你的“匿名函数”有什么相关性?它只是添加了一个闭包创建和一个函数调用。
  • 实际上根本不是“内存消耗问题”,这只是我想指出的,因为有时我需要连接“内联”并且不重用该函数。谢谢!

标签: string lua concat


【解决方案1】:
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 .. 连接更少的内存。

PIL 中涵盖了此问题

【讨论】:

  • 谢谢!这是非常有用的! (不知道/不记得 table.concat)。有时我不知道什么更有效,因为语言转换(当我使用 Java 时,然后是 Lua 或类似的东西)。非常感谢!
猜你喜欢
  • 2014-09-14
  • 2013-12-23
  • 1970-01-01
  • 2013-11-15
  • 2013-03-06
  • 2013-07-07
  • 2013-07-25
  • 1970-01-01
相关资源
最近更新 更多