我正在学习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
答案 0 :(得分:5)
craft.sword
包含密钥1
和"stick"
,而非1
和2
。你所做的相当于:
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