首页 文章

表中的Lua表显示为零

提问于
浏览
4

我正在学习Lua中的代码并遇到了我的代码问题,这是我第一次使用表,每当我在另一个表中调用一个特定的表时,我的类型为nil,打印表不显示表: xxxxx,因为它通常会(它只是打印一个空白),我假设这意味着我在定义表时做错了什么?

Code:

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)

(这是表的简化版本,用于测试此错误,但仍会在此处出现)

Output:

string
cobble
nil

table: 8a3b983

2 回答

  • 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中进行了解释 .

  • 5

    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
    

相关问题