表中的Lua表显示为零

时间:2013-09-30 17:59:13

标签: types lua null lua-table

我正在学习Lua中的代码并且遇到了我的代码问题,这是我第一次使用表,每当我在另一个表中调用特定的表时,我的类型为nil并且打印表没有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

2 个答案:

答案 0 :(得分:5)

craft.sword包含密钥1"stick",而非12。你所做的相当于:

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

请注意,任何事物都不会存储在craft.sword [2]中。

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

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

答案 1 :(得分: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