Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ipairs在大Lua表文本上循环没有任何作用_Lua - Fatal编程技术网

使用ipairs在大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,

我是从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 ...
}
您可以在每个条目中看到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编程,这对任何程序员来说都是值得一读的。