【问题标题】:Lua Table in Table Showing as Nil表中的 Lua 表显示为 Nil
【发布时间】:2013-10-06 16:50:23
【问题描述】:

我正在学习用 Lua 编写代码,但遇到了我的代码问题,这是我第一次使用表格,每当我在另一个表格中调用特定表格时,我的类型都为零,而打印表格则没有show table: xxxxx 通常会(它只是打印一个空白),我假设这意味着我在定义表格时做错了什么?

代码:

local craft = { sword = { "cobble", stick = {} } }

print(type(craft.sword[1]))
print(craft.sword[1])
print(type(craft.sword[2]))
print(craft.sword[2])
print(craft)

(这是一个简化版的表格,为了测试这个错误但这里仍然出现)

输出:

string
cobble
nil

table: 8a3b983

【问题讨论】:

  • 你使用的是标准的 Lua 解释器吗?第 4 个print 的输出应该是nil,而不是空行。
  • 不,我正在使用 Minecraft 的“计算机”模组,我猜它使用的是定制的解释器。
  • 然后您应该编辑您的问题以添加该信息以供将来参考。当你这样做时,我们都可以删除我们的 cmets 来清理线程。

标签: types lua null lua-table


【解决方案1】:

craft.sword 包含键 1"stick",而不是 12。你所做的相当于:

local craft = {}
craft.sword = {}
craft.sword[1] = "cobble"
craft.sword.stick = {}

请注意,craft.sword[2] 中绝不会存储任何内容。

更一般地,如果您使用值而不是键来声明表,例如{ "one", "two", "three" },它会将它们分配给数字索引,从 1 开始。如果您使用键和值声明它,例如 { first = "one", second = "two", third = "three" },那些值存储在您指定的键中,没有任何内容自动存储在数字索引中。如果你混合它们,就像你在这里所做的那样 - 使用 { "cobble", stick = {} } - 没有键 ("cobble") 的值会自动分配给数字索引,而那些 (stick = {}) 是分配给您指定的键。

the manual under Table Constructors 中解释了表声明如何工作的完整规范。

【讨论】:

  • 谢谢,我只是从我的程序代码中删除了stick =,它运行良好!现在对我来说,我做错了什么似乎很明显,但我一生都无法弄清楚我做错了什么:)
【解决方案2】:

craft 中的表sword 具有类数组部分和类哈希部分的混合索引。所以

local craft = { sword = { "cobble", stick = {} } }

等价于

local craft = { sword = { 1 = "cobble", stick = {} } }

或(stick 是字符串索引)

local craft = { sword = { [1] = "cobble", ["stick"] = {} } }

如果需要将匿名表放入索引2,可以这样使用:

local craft = { sword = { "cobble", { stick = {} } } } 
--                                  ^            ^

你的测试代码在我的机器上的输出:

string
cobble
table
table: 003CA158
table: 003CB0C8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-20
    • 2017-06-15
    • 2016-06-01
    • 2021-12-16
    • 1970-01-01
    • 2021-07-15
    • 2020-04-21
    • 1970-01-01
    相关资源
    最近更新 更多