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

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

  1. units -> 返回一个单位的表。
  2. units[0] -> 返回一个数字。
  3. units[0].properties -> 返回属性的表。
  4. units[0].properties[0] -> 返回单位[0]的属性,也是一个数字。

前两个步骤对于一个数字索引的表来说是微不足道的。 但我能同时实现所有四个要求吗?

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

点赞
用户2425163
用户2425163

有人可以通过 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 等元方法来实现。

2017-11-21 21:15:21