перебирать таблицу в функции 'self', такой как obj: имя_функции - PullRequest
1 голос
/ 23 июня 2019

У меня есть объект класса, для которого я хочу получить наибольшее целое число в таблице

obj = {1,2,3}
obj[6] = 7
--this works with 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

--but now if I want this function to be only available to my object then this 
--somehow doesn't work

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 в качестве вывода.Я не знаю, что пошло не так.Может ли кто-нибудь помочь?

1 Ответ

0 голосов
/ 23 июня 2019

Используйте мета-таблицу с метаметодом __index, указывая на таблицу, в которой ваша функция будет вызываться без перебора функции (что делает ваш код).

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

setmetatable(obj, {
  __index = { -- set index metamethod with another table
    vec_len = function(self) -- you can call obj:vec_len() and self will be the table without the functions
      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
...