Lua中的嵌套索引:a ['0']。b ['0']?

时间:2017-11-20 23:07:42

标签: lua

我想实现一些Lua数据结构来实现以下语法:

  1. units - >返回一个单位表。
  2. units[0] - >返回一个数字。
  3. units[0].properties - >返回一个属性表。
  4. units[0].properties[0] - >返回单位[0]的属性,也是一个数字。
  5. 给定数字索引表,前两个步骤是微不足道的。 但我可以同时达到所有4个要求吗?

    我正在考虑使用自定义units元方法创建__index。这是正确的方向吗?

1 个答案:

答案 0 :(得分:1)

可以为所有数字设置元表(通过debug.setmetatable)并使用__index元方法来解析属性:

local properties_by_nums = {
  {42},
  {23},
}

local num_mt = {
  __index = function(n, i)
    if i == 'properties' then
      return properties_by_nums[n]
    end
    return nil
  end
}

debug.setmetatable(0, num_mt)

units = {1, 5}

print(type(units))                                          -- table
print(units[1], type(units[1]))                             -- 1, number
print(type(units[1].properties))                            -- table
print(units[1].properties[1], type(units[1].properties[1])) -- 42, table

(可能更干净)替代方案是将您的单位值定义为表现类似数字的表格。这可以通过实现元方法__add__mul等来实现。