【问题标题】:Lua table initialization - what is incorrect here [duplicate]Lua表初始化-这里不正确[重复]
【发布时间】:2014-08-09 05:59:16
【问题描述】:

我正在尝试初始化和打印一个表格。它只是不工作。知道这段代码有什么问题吗?

--!/usr/bin/env lua


local retv = {}
retv["test"] = 1000

for k,v in ipairs(retv) do
    print (k,v)
end

它什么也不打印。我确定我错过了一些非常基本的东西,但我无法弄清楚。

【问题讨论】:

  • 奇怪的文件开头。那应该是Unix shebang吗? #!/usr/bin/env lua
  • 哦,抱歉,这只是我的终端会话中的剪切和粘贴错误 - 错过了 #

标签: lua initialization lua-table


【解决方案1】:

Lua 中有两种形式的for-loop:
数字和通用 for 循环。

ipairs(t) 是一个迭代器构造函数,最多返回三个适用于泛型 for 的参数,允许您按顺序迭代初始序列(索引 1、2、3、...)。
可能的实现:

function ipairs(t)
  local i = 0
  return function()
    i = i + 1
    if t[i] ~= nil then
      return i, t[i]
    end
  end
end
local function ipairs_helper(t, i)
  i = i + 1
  if t[i] ~= nil then
    return i, t[i]
  end
end
function ipairs(t)
  return ipairs_helper, t, 0
end

如您所见,这将永远不会返回您的带有密钥 "test" 的条目。

你想要的是pairs(t),它相当于next, t
这将迭代所有元素。

【讨论】:

    【解决方案2】:

    您需要使用pairs 而不是ipairspairs 遍历所有键,ipairs 仅遍历 keys that form a sequence of integers starting from 1 without gaps。 (这些键是存储在数组中还是表的哈希部分是一个实现细节,可能会在表的生命周期内发生变化。)

    例如,ipairs({'a', 'b', nil, 'c'}) 迭代键 1 和 2,在(但不包括)3 处停止,因为表中缺少该键。

    【讨论】:

    • 术语来自Lua FAQ:“ipairs(t) 遍历数组部分”。
    • 更新了答案以反映这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 2023-03-09
    • 2021-09-07
    • 2017-10-24
    相关资源
    最近更新 更多