在Lua中以0开始表的索引

Fox*_*Fox 2 arrays lua lua-table

我想设置表成员的索引,但仍然命名它们.那可能吗?

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" },
    },
}
Run Code Online (Sandbox Code Playgroud)

table["cat"][1]fish,但我想要的table["cat"][0]fish,我怎样才能实现这一目标?

编辑: 我仍然希望能够访问fish使用table["cat"]["fish"].

EDIT2:

什么时候我试着这样做呢?http://repl.it/MCu 我做错了什么?

Yu *_*Hao 5

您的表和嵌套在表中的表是纯哈希样式,没有数组样式.

数组样式的Lua表:

local t = {"cat", "dog", "fish"}
Run Code Online (Sandbox Code Playgroud)

只是一个等价形式的语法糖:

local t = {[1] = "cat", [2] = "dog", [3] = "fish"}
Run Code Online (Sandbox Code Playgroud)

您可以使用所有类型的键,除了nil,确保您可以使用从0以下开始的整数键:

local t = {[0] = "cat", [1] = "dog", [2] = "fish"}
Run Code Online (Sandbox Code Playgroud)

需要注意的是,从开始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)
-- Output: bla     bla
Run Code Online (Sandbox Code Playgroud)

通过这种方式,t.catt[0]访问同一个表.

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


gre*_*olf 5

只是澄清一下,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" },
    },
}
Run Code Online (Sandbox Code Playgroud)

如果你想要animal.cat.fishanimal.cat[1]具有相同的值(相同的 lua 表),只需执行常规分配:

animal.cat[1] = animal.cat.fish
-- and likewise if you want index 0:
animal.cat[0] = animal.cat.fish
Run Code Online (Sandbox Code Playgroud)

请注意,许多与表一起使用的标准 lua 函数都是从 1 开始计数的。

  • @Fox 第二个在语法上不是有效的 lua。 (2认同)
  • @Fox你错了。您可以在 http://repl.it/ 中对此进行测试。当您尝试编译该块时,它实际上会给您一个语法错误。也许你记错了? (2认同)