Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 在';自我';功能,如obj:功能名称_Lua_Lua Table - Fatal编程技术网

Lua 在';自我';功能,如obj:功能名称

Lua 在';自我';功能,如obj:功能名称,lua,lua-table,Lua,Lua Table,我有一个类对象,我想要表中的最高键整数 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

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

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作为输出。我不知道出了什么问题。有人能帮忙吗?

使用带有_index metamethod的元表,指向一个包含您的函数的表,该函数将在不迭代函数的情况下调用(您的代码就是这样做的)


使用带有_index metamethod的元表,指向包含函数的表,该函数将在不迭代函数的情况下调用(代码就是这样做的)


什么东西不管用?我的意思是,除了在某一点上,你要将一个整数与字符串“vec_len”进行比较之外?如果你想
vec_len
obj
以外的其他东西进行操作,那么你为什么要将
a
改为
self
?对不起,这是个打字错误,我做了我的edit@NicolBolas Lua编译器抱怨访问nil类型,我敢肯定,当Lua查看obj表时,函数ref不可用。请将
pairs
替换为
ipairs
(您键入的
k
可能是
“vec\len”
现在,这是一个字符串,无法与数字进行比较)它有什么问题?我的意思是,除了在某一点上,你要将一个整数与字符串“vec_len”进行比较之外?如果你想
vec_len
obj
以外的其他东西进行操作,那么你为什么要将
a
改为
self
?对不起,这是个打字错误,我做了我的edit@NicolBolas Lua编译器抱怨访问nil类型,我敢肯定,当Lua查看obj表时,函数ref不可用。请将
pairs
替换为
ipairs
(您键入的
k
可能是
“vec\len”
现在,这是一个字符串,无法与数字进行比较)虽然这解决了问题,但可能不是最佳做法。虽然这解决了问题,但可能不是最佳做法。
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