【问题标题】:Start Index of table at 0 in LuaLua中表的起始索引为0
【发布时间】:2013-11-11 02:02:47
【问题描述】:

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

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 我做错了什么?

【问题讨论】:

  • table["cat"][1]nil。你所有的表都是类似哈希的,没有一个是类似数组的。
  • 哦 : O 那么我怎样才能让它们像数组一样呢?
  • 有一个名为table的标准模块。最好不要命名变量 table 以避免混淆,除非目标确实是本地化全局。其他标准模块coroutinestringmathioosdebug 也是如此。重载这些名称中的任何一个都可能导致混淆。
  • 是的,只是用于示例;)

标签: arrays lua lua-table


【解决方案1】:

只是为了澄清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
-- and likewise if you want index 0:
animal.cat[0] = animal.cat.fish

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

【讨论】:

  • local animal = {local ["animal"] = { 之间有区别吗?
  • @Fox 第二个在语法上不是有效的 lua。
  • 嗯,但它有效吗?我知道有人用这种方式编码,他为什么这样做? : 哦
  • @Fox 你错了。您可以在repl.it 中对此进行测试。当您尝试编译该块时,它实际上会给您一个语法错误。也许你记错了?
  • @Fox 您需要将_LEG_ARM_HEAD 放在方括号中,否则它将被解释为字符串键。例如。 cat = { [_LEG] = {name = "leg1"} } -- etc...
【解决方案2】:

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

数组样式的 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 不再是序列,因此您失去了仅用于序列的表函数的功能,例如 #operator、ipairs 等。


要建一张不同key的表,可以先做value表,然后把不同的key绑定到同一张表上,如下:

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

这样t.catt[0] 访问同一个表。

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

【讨论】:

  • 好的,但是我怎样才能让那个“猫”也成为一张桌子呢?我想将其称为 table.cat.stuff,但也称为 table[0].stuff。那是两把钥匙吗?
  • @Fox 您可以创建另一个表,然后使用两个键 "cat"0 使用该表作为值来构建表。但这有点麻烦,你确定你真的需要这个吗?
  • 是的,我需要它。但是如何使用两个键构建表?
  • 正确的语法是{[1] = "cat", [2] = "dog", [3] = "fish"}
猜你喜欢
  • 2014-12-04
  • 1970-01-01
  • 2012-12-20
  • 2014-01-29
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 2011-02-17
相关资源
最近更新 更多