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中,如何知道表是否包含类函数?_Lua - Fatal编程技术网

在Lua中,如何知道表是否包含类函数?

在Lua中,如何知道表是否包含类函数?,lua,Lua,假设我使用:运算符声明lua函数,如下所示: function ClassName:myFunc( stuff ) --do stuff end 然后假设我将该函数存储在如下表中: someTable = { ClassName.myFunc, someGlobalFunc, } 然后,假设我有另一个函数,它遍历表并试图调用给定的函数 function ClassName:callStuffInThisTable(table) -- I go through

假设我使用:运算符声明lua函数,如下所示:

function ClassName:myFunc( stuff )
    --do stuff
end
然后假设我将该函数存储在如下表中:

someTable = {
    ClassName.myFunc,
    someGlobalFunc,
} 
然后,假设我有另一个函数,它遍历表并试图调用给定的函数

function ClassName:callStuffInThisTable(table)
    -- I go through the table, which might be someTable above, and call all the functions
end

我的问题是,如何知道表中的函数是否属于ClassName,以便我可以使用self调用它

你没有。至少Lua不会告诉你的

函数类名称:myFunc(stuff)
对于Lua来说只是语法上的糖。它与此没有什么不同:
ClassName.myFunc=function(self,stuff)
。这些函数是等价的。 同样,对于:call语法,
ClassName:myFunc(stuff)
在语义上等同于
ClassName.myFunc(ClassName,stuff)

这取决于你知道你的功能是什么,它们做什么。这需要编码规范。如果您有一个需要在循环中调用的函数列表,那么应该将它们设计为使用相同的参数调用

有两种方法可以做到这一点。一种方法是将所有函数设置为“类函数”:

这样,将忽略
self
参数。显然,您可以创建一个特殊的函数表对象,该对象具有将“全局”函数插入表中的函数,该表将自动生成包装器:

function insertFuncIntoTable(self, func)
  self[#self + 1] = function(self, ...) func(...) end
end

insertFuncIntoTable(someTable, someGlobalFunc)
注意:假设“someGlobalFunc”实际上是全局表的一个成员(而不是
local
)。此版本将采用
\u G[“someGlobalFunc”]
当前拥有的值,就像原始代码一样。但是,第一个版本采用调用时的值,该值可能与创建
someTable
时的函数不同

所以这个版本更安全

或者,您可以使表中的任何“类函数”显式绑定到对象实例:

someTable = {
    function(self, ...) ClassName.myFunc() end,
    function(self, ...) return someGlobalFunc(...) end,
} 
顺便说一句,一般来说,如果您使用
语法声明函数,那么您应该通过
实例:myFunc(…)
以这种方式使用该函数。很明显,它和其他函数一样,只是一个Lua函数,所以你可以随心所欲。但误用会使理解发生了什么变得更加困难


Lua给了你很多力量。但在编写代码时,您仍然需要进行判断和约束。Lua不会(完全)将您从自己手中解救出来。

判断函数是否由ClassName“拥有”的一种方法是扫描和检查

ClassName = {}
function ClassName:fn(self) ... end

t = { function() ... end , ClassName.fn() }

function has_value( klass, value )
  for k,v in pairs(klass) do
    if v==value then return true
  end
  return false

function ClassName:callStuffInThisTable(table)
  for k,v in pairs(table) do
    if has_value(ClassName, v) then
      v(self)
    else
      v()
    end
  end
end
由于表扫描,这有O(n^2)行为。通过将ClassName中的函数用作新表,我们可以将其简化为O(n log(n))

function ClassName:callStuffInThisTable(table)
  local t = {}
  for k,v in pairs(ClassName) do
    t[v] = 1
  end

  for k,v in pairs(table) do
    if t[v]==1 then
      v(self)
    else
      v()
    end
  end
end   

出于好奇,为什么您希望/需要调用给定表中的所有函数,而不能强制要求所有这些函数要么都是类方法,要么都是裸函数?感谢您的帮助。我未能实现的一个飞跃是,由于函数是匿名的,它们的名称没有任何意义。最终,我要做的是创建一个脚本,在必要时通过函数和参数进行迭代,等待,所以我要这样做:script={{func,{params},},理想情况下,尽管我有用户函数和预实现的函数。我可以很容易地通过一个自我对象,我只是想变得聪明。
function ClassName:callStuffInThisTable(table)
  local t = {}
  for k,v in pairs(ClassName) do
    t[v] = 1
  end

  for k,v in pairs(table) do
    if t[v]==1 then
      v(self)
    else
      v()
    end
  end
end