使用ipairs在大Lua表文本上循环没有任何作用
我是从Javascript来到Lua的,但是有一些显著的差异导致我做了一些愚蠢的事情。我定义了一个表文字来保存一些静态数据:使用ipairs在大Lua表文本上循环没有任何作用,lua,Lua,我是从Javascript来到Lua的,但是有一些显著的差异导致我做了一些愚蠢的事情。我定义了一个表文字来保存一些静态数据: ObjectTypeDefs = { mailbox={ time=40, yield={{name="Base.Plank"}, {name="Base.Newspaper"}, {name="Base.ScrapMetal"}}, tools={{"Base.AxeStone", "Base.Axe"}}, cheat=false,
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 ...
}
您可以在每个条目中看到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循环甚至没有启动。怎么了?这是一个可运行的示例:您必须使用它来迭代表的哈希部分。用于对表的数字部分进行迭代,有时最好用数字替换
这与问题无关,但也要注意你的全局。您确定ObjectTypeDefs必须是全局变量吗?您必须使用它来迭代表的哈希部分。用于对表的数字部分进行迭代,有时最好用数字替换
这与问题无关,但也要注意你的全局。您确定ObjectTypeDefs必须是全局变量吗?您使用的是只在整数索引上迭代的变量。您应该改为使用。您使用的是只在整数索引上迭代的。您应该改为使用。ipairs迭代整数索引,从表[1]开始,到第一个表元素为零结束
您必须使用pairs或next,pairs在内部使用它。但请记住,输出顺序是任意的
for k,v in pairs(yourTable) do
...
end
或
ipairs迭代整数索引,从表[1]开始,到第一个表元素为零为止
您必须使用pairs或next,pairs在内部使用它。但请记住,输出顺序是任意的
for k,v in pairs(yourTable) do
...
end
或
请注意,您正在链接到过时的PiL版本。在现代Lua版本中,iPair的行为略有不同,AFAIR。那么,不同的行为是什么呢?这来自Lua5.3参考:ipairs t返回三个值一个迭代器函数、表t和0,因此ipairst do body end中的i,v的构造将迭代键-值对1,t[1],2,t[2],…,直到第一个nil值。实际上,我感觉5.3在随机nil处停止,但我错了。5.3 ipairs支持元方法,但与此问题无关。请注意,您链接到的是过时的PiL版本。在现代Lua版本中,iPair的行为略有不同,AFAIR。那么,不同的行为是什么呢?这来自Lua5.3参考:ipairs t返回三个值一个迭代器函数、表t和0,因此ipairst do body end中的i,v的构造将迭代键-值对1,t[1],2,t[2],…,直到第一个nil值。实际上,我感觉5.3在随机nil处停止,但我错了。5.3 ipairs支持metamethods,但与这个问题无关。目前,我不知道如何声明局部变量。Lua似乎不像javascript那样具有自调用闭包。我将阅读更多关于变量作用域的内容,但ObjectTypeDefs可能必须保持全局性。使用局部,就像在JS中使用var一样。Lua确实有闭包,但在这种情况下不需要闭包,因为Lua有完整的词法范围。获取最新版本的Lua编程,这对任何程序员来说都是值得一读的。现在,我不知道如何声明局部变量。Lua似乎不像javascript那样具有自调用闭包。我将阅读更多关于变量作用域的内容,但ObjectTypeDefs可能必须保持全局性。使用局部,就像在JS中使用var一样。Lua确实有闭包,但在这种情况下不需要闭包,因为Lua有完整的词法范围。获取最新版本的Lua编程,这对任何程序员来说都是值得一读的。