4

我正在学习用 Lua 编写代码,但遇到了代码问题,这是我第一次使用表格,每当我在另一个表格中调用特定表格时,我的类型都为零,并且打印表格不显示表格: 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
4

2 回答 2

5

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

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

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

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

表声明如何工作的完整规范在手册表构造器下进行了解释。

于 2013-09-30T18:18:10.563 回答
1

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

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-30T23:57:14.907 回答