2013-10-31 52 views
2

我想設置表成員的索引,但仍然命名它們。那可能嗎?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

EDIT2:

什麼,當我嘗試反之亦然辦呢? http://repl.it/MCu 我在做什麼錯?

+2

'table [「cat」] [1]''是'nil'。所有的表都是散列式的,沒有一個是數組式的。 –

+0

哦:哦所以我怎麼才能讓它們像數組一樣? – Fox

+0

有一個名爲'table'的標準模塊。除非目標真的是將本地化,否則不要命名變量「表」以避免混淆。其他標準模塊'coroutine','string','math','io','os'和'debug'也是如此。重載任何這些名字可能是混淆的祕訣。 – RBerteig

回答

4

只是爲了澄清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開始計數。

+0

「本地動物= {'和'本地[」動物「] = {'? – Fox

+2

@Fox第二個不是句法上有效的lua。 – greatwolf

+0

嗯,但它的作品?我知道有人編碼,他爲什麼這樣做? :O – Fox

5

您的表格和嵌套在表格中的表格是純散列樣式,沒有數組樣式。

的陣列式的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) 
-- Output: bla  bla 

這樣,t.catt[0]訪問同一個表。

請注意,您可以使用語法糖形式的table.cat.fish代替table["cat"]["fish"]

+0

好吧,但我怎麼能讓「貓」也是一張桌子呢?我想把它叫做table.cat.stuff,但是也要調用table [0] .stuff。那兩把鑰匙呢? – Fox

+0

@Fox您可以創建另一個表,然後使用該表作爲值,使用鍵「cat」和「0」構建表。但是處理起來有點麻煩,你確定你確實需要這個嗎? –

+0

是的,我需要它。但是我怎樣才能用這兩個鍵來建立桌子呢? – Fox