在Lua中,表的起始索引是0。

我想设置表格成员的索引,但仍然保留它们的名称。这可能吗?

local table = {
    ["cat"] = {
        ["fish"] = { stuff = "bla1", stuff2 = "bla" },
        ["mouse"] = { stuff = "bla2", stuff2 = "bla" },
        ["bird"] = { stuff = "bla3", stuff2 = "bla" },
    },
    ["dog"] = {
        ["fish"] = { stuff = "bla1", stuff2 = "bla" },
        ["mouse"] = { stuff = "bla2", stuff2 = "bla" },
        ["bird"] = { stuff = "bla3", stuff2 = "bla" },
    },
}

table["cat"][1]fish,但我希望 table["cat"][0]fish,我该如何实现这一点?

编辑: 我仍然希望能够通过 table["cat"]["fish"] 访问 fish

编辑2: 如果我尝试反过来做呢? http://repl.it/MCu 我做错了什么?

点赞
用户1009479
用户1009479

你的表格以及嵌套在其中的表格都是纯哈希样式 (hash-style),不是数组样式 (array-style)。

数组样式的 Lua 表格:

local t = {"cat", "dog", "fish"}

实际上只是等同于下面的语法糖形式:

local t = {[1] = "cat", [2] = "dog", [3] = "fish"}

你可以使用任何类型的键,除了 nil,你可以使用从 0 开始的整数键:

local t = {[0] = "cat", [1] = "dog", [2] = "fish"}

注意,从 0 开始就使得 t 不再是一个序列,所以你失去了仅适用于序列的表格函数的功能,例如 # 操作符,ipairs 等。


要构建带有不同键的表格,你可以首先制作值表格,然后像这样将不同的键绑定到同一个表格中:

local v = {
    ["fish"] = { stuff = "bla", stuff2 = "bla" },
    ["mouse"] = { stuff = "bla", stuff2 = "bla" },
    ["bird"] = { stuff = "bla", stuff2 = "bla" },
}

local t = {
    ["cat"] = v,
    [0] = v,
}
print(t.cat.fish.stuff, t[0].fish.stuff)
-- 输出:bla     bla

这样,t.catt[0] 访问的是同一个表格。

注意,你可以使用语法糖形式 table.cat.fish 而不是 table["cat"]["fish"]

2013-10-31 07:12:45
用户234175
用户234175

只是为了澄清, table["cat"][1] 不是 一只 fish。你上面的表格示例根本没有使用表格索引部分。要使用表格索引部分,必须将键本身设为整数。

修改你上面的示例:

local animal = {
    cat = {
        fish = { stuff = "bla", stuff2 = "bla" },
        mouse = { stuff = "bla", stuff2 = "bla" },
        bird = { stuff = "bla", stuff2 = "bla" },
    },
    dog = {
        fish = { stuff = "bla", stuff2 = "bla" },
        mouse = { stuff = "bla", stuff2 = "bla" },
        bird = { stuff = "bla", stuff2 = "bla" },
    },
}

如果你想让 animal.cat.fishanimal.cat[1] 拥有相同的值(相同的 Lua 表格),只需进行常规赋值:

animal.cat[1] = animal.cat.fish
-- 如果你希望有索引 0,也是一样的
animal.cat[0] = animal.cat.fish

请注意,许多标准的 Lua 函数都是从 1 开始计数的。

2013-10-31 07:39:17