使用ipairs循环遍历大Lua表文字不会做任何事情

时间:2016-03-04 11:01:45

标签: lua

我是从Javascript来到Lua的,但是有一些显着的差异导致我做了愚蠢的事情。我定义了一个表文字来保存一些静态数据:

ObjectTypeDefs = {
  mailbox={
    time=40,
    yield={{name="Base.Plank"}, {name="Base.Newspaper"}, {name="Base.ScrapMetal"}},
    tools={{"Base.AxeStone", "Base.Axe"}},
    cheat=false,
    displayName="Mailbox"
  },
  laundry={
    time=300,
    yield={{name="Radio.ElectricWire"}, {name="Base.ScrapMetal"}},
    exp={electrical=3},
    tools={"Base.Screwdriver", "Base.KitchenKnife"},
    cheat=false,
    displayName="Laundry machine"
  },
  wood_chair={ ... and so on ...}

  ... more items here ...
}

Yo可以在每个条目中看到tools子键。这定义了执行某些操作所需的一些游戏工具。我想为所有tools子项分配一些验证器功能。我试着这样做:

  print("Initializing object definitions: ");
  -- Here, callbacks for definitions are assigned
  for i,v in ipairs(ObjectTypeDefs) do
    print("Defining checkItems callback for "..i..".");
    v.tools.checkItems = ... some closure here ...;
  end

但我得到的所有输出都是:

Initializing object definitions:

for循环甚至没有启动。它出什么问题了?这是可运行的示例:http://ideone.com/QqYU04

3 个答案:

答案 0 :(得分:3)

您必须使用pairs来迭代表的哈希部分。 ipairs用于迭代表的数字部分(有时更好地用数字代替)。

这与问题无关,但也要注意你的全局变量。您确定ObjectTypeDefs必须是全局变量吗?

答案 1 :(得分:3)

您正在使用仅在整数索引上迭代的ipairs。您应该使用pairs

答案 2 :(得分:3)

ipairs遍历整数索引,从yourTable[1]开始,到第一个表格元素nil结束。

您必须使用pairsnext(内部由pairs使用)。但请记住,输出顺序是任意的。

for k,v in pairs(yourTable) do
  ...
end

for k,v in next, yourTable do
  ...
end

http://www.lua.org/pil/7.3.html