2012-08-08 51 views
3

我有一個表在Lua:如何引用表成員的lua表成員?

enUS = { 
    LOCALE_STHOUSANDS = ",", --Thousands separator e.g. comma 

    patNumber = "%d+["..LOCALE_STHOUSANDS.."%d]*", --regex to find a number 

    ["PreScanPatterns"] = { 
     ["^("..patNumber..") Armor$"] = "ARMOR", 
    } 
} 

所以你看,有自我參照此表一整個鏈條:

  • LOCAL_STHOUSANDS
    • patNumber
      • ["^("..patNumber..") Armor$"]

如何在lua表中執行自引用?


我不想做的是必須硬性替換值;有數以百計的引用:

enUS = { 
    LOCALE_STHOUSANDS = ",", --Thousands separator e.g. comma 

    patNumber = "%d+[,%d]*", --regex to find a number 

    ["PreScanPatterns"] = { 
     ["^(%d+[,%d]*) Armor$"] = "ARMOR", 
    } 
} 

回答

4

我怎麼能進行自引用在LUA表?

你不知道。

Lua不是C.在構造表之前,沒有任何表項存在。因爲表格本身還不存在。因此,您不能在表構造函數中有一個條目引用不存在的表中的另一個條目。

如果你想削減重複打字,那麼你應該使用局部變量和do/end塊:

do 
    local temp_thousands_separator = "," 
    local temp_number_pattern = "%d+["..LOCALE_STHOUSANDS.."%d]*" 

    enUS = { 
    LOCALE_STHOUSANDS = temp_thousands_separator, --Thousands separator e.g. comma 

    patNumber = "%d+["..temp_thousands_separator.."%d]*", --regex to find a number 

    ["PreScanPatterns"] = { 
     ["^("..temp_number_pattern..") Armor$"] = "ARMOR", 
    } 
    } 
end 

do/end塊是存在的,這樣的臨時變量不創建表之外存在碼。

或者,你可以做施工階段:

enUS = {} 
    enUS.LOCALE_STHOUSANDS = ",", --Thousands separator e.g. comma 

    enUS.patNumber = "%d+["..enUS.LOCALE_STHOUSANDS.."%d]*", --regex to find a number 

    enUS["PreScanPatterns"] = { 
     ["^("..enUS.patNumber..") Armor$"] = "ARMOR", 
    } 
3

有沒有這樣的構造本身內部的方式,但你可以創造一個像這樣的表之後做到這一點:

enUS = { 
    LOCALE_STHOUSANDS = "," 
} 

enUS.patNumber = "%d+["..enUS.LOCALE_STHOUSANDS.."%d]*" 
enUS.PreScanPatterns = { 
    ["^("..enUS.patNumber..") Armor$"] = "ARMOR", 
} 

如果你特別需要參考當前表格,Lua提供了一個「self」參數,但它只能在函數中訪問。

local t = { 
    x = 1, 
    y = function(self) return self.x end 
} 

-- this is functionally identical to t.y 
function t:z() return self.x end 

-- these are identical and interchangeable 
print(t:y(), t.z(t)) 
-- 1, 1