使用ipairs循环遍历大的Lua table字面量没有任何作用

我从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={ ... 和其他 ...}

  ... 这里有更多的项 ...
}

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

  print("Initializing object definitions: ");
  -- 在这里,为定义分配回调
  for i,v in ipairs(ObjectTypeDefs) do
    print("Defining checkItems callback for "..i..".");
    v.tools.checkItems = ... 这里有一些闭包 ...;
  end

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

Initializing object definitions:

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

点赞
用户6236
用户6236

你必须使用pairs函数来遍历表的哈希部分。 ipairs函数用于遍历表的数字部分(有时最好用数字方法替换该函数)。

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

2016-03-04 11:14:58
用户1190388
用户1190388

你正在使用 ipairs,它只迭代整数索引。相反,你应该使用 pairs

2016-03-04 11:17:06
用户2858170
用户2858170

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

2016-03-04 12:03:43