如何在 'self' 函数中迭代表格,例如 obj:function_name

我有一个类对象,我想要表格中最大键的整数值

obj = {1,2,3}
obj[6] = 7
--这可以用 vec_len(obj) 实现
function vec_len(a)
    if not a then return 0 end
    max_key = 0
    for k, _ in pairs(a) do
        if k > max_key then max_key = k end
    end
    return max_key
end

--但是现在如果我想让这个函数只在我的对象中可用,则
--似乎不起作用

function obj:vec_len()
    if not self then return 0 end
    max_key = 0
    for k, _ in pairs(self) do
        if k > max_key then max_key = k end
    end
    return max_key
end

我想要输出 6。我不知道是什么出了问题。有谁能帮忙吗?

点赞
用户11286578
用户11286578

使用带有 __index 元方法的元表,指向一个具有您将不迭代函数调用的功能的表格(您的代码做到了这一点)。

obj = {1,2,3}
obj[6] = 7

setmetatable(obj, {
  __index = { -- 使用另一个表设置索引元方法
    vec_len = function(self) -- 您可以调用 obj:vec_len(),并且 self 将是没有函数的表格
      local max_key = 0

      for k, _ in pairs(self) do
        if k > max_key then
          max_key = k
        end
      end

      return max_key
    end
  }
})

---------------------
--> print(obj:vec_len())
--> 6
2019-06-23 00:50:28