【发布时间】:2014-10-13 18:25:01
【问题描述】:
我想在 Lua 文件中调用一个函数,但前提是该函数存在, 怎么做呢?
【问题讨论】:
我想在 Lua 文件中调用一个函数,但前提是该函数存在, 怎么做呢?
【问题讨论】:
试试if foo~=nil then foo() end。
【讨论】:
foo 定义在那里的情况下加载文件,那么这要困难得多,如果不是不可能的话。
__call 元方法。我认为最简单的解决方案是最好的。
我认为涵盖所有可能性的最强大(对象不存在,或者它存在但不是函数,或者不是函数但可调用)是使用受保护的调用来实际调用它:如果它不存在,那么什么都不会真正被调用,如果它存在并且是可调用的,则返回结果,否则不会真正被调用。
function callIfCallable(f)
return function(...)
error, result = pcall(f, ...)
if error then -- f exists and is callable
print('ok')
return result
end
-- nothing to do, as though not called, or print('error', result)
end
end
function f(a,b) return a+b end
f = callIfCallable(f)
print(f(1, 2)) -- prints 3
g = callIfCallable(g)
print(g(1, 2)) -- prints nothing because doesn't "really" call it
【讨论】:
非实例化变量被解释为nil,所以下面是另一种可能性。
if not foo then
foo()
end
【讨论】:
如果您有一个可能是全局函数名称的字符串:
local func = "print"
if _G[func] then
_G[func]("Test") -- same as: print("test")
end
如果你有一个可能有效的函数:
local func = print
if func then
func("ABC") -- same as: print("ABC")
end
如果您想知道发生了什么以及上面的背景是什么,_G 是 lua 上的一个全局表,其中存储了每个全局函数。此表按名称存储全局变量作为键和值(函数、数字、字符串)。如果您的 _G 表不包含您要查找的对象的名称,那么您的对象可能不存在或者它是本地对象。
在第二个代码框中,我们创建了一个名为func 的local 变量,并将print 函数作为值赋予它。 (请注意,不需要括号。如果打开括号,它会调用函数并获取输出值,而不是它自己的函数)。
块上的if 语句,检查您的函数是否存在。在 lua 脚本中,不仅booleans 可以使用简单的if 语句检查,还可以使用简单的if 语句检查函数和对象的存在。
在 if 块中,我们调用 local 变量,就像我们如何调用值的全局函数 (print),更像是给函数 (print) 赋予第二个名称或方便使用的快捷方式名称。
【讨论】: