如何从 Lua 表成员中引用另一个表成员?

7

i have a table in 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",
   }
}
2个回答

9

我如何在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",
   }

5

在构造函数内部无法完成此操作,但您可以在创建表后执行以下操作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接