Lua中的嵌套表显示为Nil。

我正在学习Lua编程,遇到了我的代码问题,这是我第一次使用表格,每当我调用另一个表格中的特定表格时,我会得到类型nil,而打印表格并不会像通常情况下那样显示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)

(这是一个简化版的表格,测试此错误,但它仍然在这里发生)

** 输出:**

字符串
鹅卵石
空的

table: 8a3b983
点赞
用户2755919
用户2755919

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 = {})会被分配到你指定的键中。

关于表声明的完整规范在 [手册的表构造函数章节](http://www.lua.org/manual/5.2/manual.html#3.4.8)中有详细说明。

2013-09-30 18:18:10
用户1009479
用户1009479

你的 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
2013-09-30 23:57:14