【问题标题】:How to initialize table size in lua如何在lua中初始化表大小
【发布时间】:2016-02-28 10:22:16
【问题描述】:

将数字转换为表格的最有效方法是什么?或者是否可以制作一个没有循环的表格?

local t = 10 -- given number
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} -- result

更新:t 变量是可变数字,我想为每个值。

t = 3

function foreach(f, t)
  for i, v in ipairs(t) do
    f(v)
  end   
end

foreach(print, t)
1
2
3

我需要在 Lua 中使用new Array(n) 的最快方式。还是没有任何意义?

【问题讨论】:

  • 你能和我们分享一下,你为什么想要这样一张桌子?如果您的唯一目标是拥有一个长度为 10 但不一定有 10 个元素的表格,则可以使用 table.setn
  • 您可以将lua_createtatble 导出到Lua。 table.setn 已被贬低,只是设置n=x 但不分配内存(我不确定)。但我真的建议在实施任何实施之前进行性能测试。
  • @SebastianHoffmann 感谢您的评论。我想在这个例子中避免双循环。但是我得到了foo = {}; print(table.setn(foo, 10)) stdin:1:尝试调用字段'setn'(一个零值)堆栈回溯:stdin:1: in main chunk [C]: in ? `
  • @moteus 感谢您的评论。这对我来说听起来很难。我正在尝试找到lua_createtable 方式。
  • @TomBlodget:是的,但是您不能从 Lua 脚本 访问实现的“内部数据结构”。 OP 在询问您可以从 Lua 中做什么。

标签: lua lua-5.1


【解决方案1】:

也许你不知道如何回答@Sebastian 的问题。这里有一些可供您思考的替代方案。

由于您的表只有计算元素,您可以省略存储,只对每次读取访问执行计算(index 操作)。

local function newArray(size)
    local t = {}
    setmetatable(t, {
           __index = function (_, i) 
               return i >= 1 and i <= size and i or nil end})
    return t
end

t10 = newArray(10)
for i = 0, 11 do -- ipairs won't work as expected with such a table
    print(i, t10[i])
end
t10[2] = "stored values override __index"
print(t10[2])

当然,您也可以将表替换为仅返回值的标识函数,甚至仅使用标识表达式。但是,也许您对表有未明确的要求,或者您需要 ipairs 来迭代序列。

说到迭代器,

local function seq_itor(first, last)
    local i = first - 1
    return function ()
        i = i + 1
        if i <= last then return i end
    end
end

for i in seq_itor(1, 10) do
    print(i)
end

【讨论】:

    【解决方案2】:

    最简单的方法是定义一个函数:

    function newArray(size)
        local t = {}
        for i = 1, size do
            t[i] = i
        end
        return t
    end
    

    【讨论】:

      猜你喜欢
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多