Lua仅当函数存在时才调用它?

我想在 Lua 文件中调用一个函数,但只有在该函数存在的情况下才进行调用。 有什么方法可以实现这个功能?

点赞
用户107090
用户107090

尝试 if foo~=nil then foo() end

2014-08-20 11:55:38
用户1457350
用户1457350

如果变量 foo 未实例化,则会将其解释为 nil,因此下面是另一种可能性。

if not foo then
    foo()
end
2014-08-28 21:04:15
用户2248354
用户2248354

如果您有一个字符串可能是全局函数的名字:

local func = "print"

if _G[func] then
    _G[func]("Test") -- 和:print("test")是一样的
end

如果您有一个可能是有效的函数:

local func = print

if func then
    func("ABC") -- 和:print("ABC")是一样的
end

如果您想知道上面发生了什么以及背景知识,_G是Lua中一个存储每个全局函数的全局表。这个表通过名称作为键存储全局变量,并存储值(函数、数字、字符串)。如果您的 _G 表中不包含您要查找的对象的名称,则您的对象可能不存在或是一个本地对象。

在第二个代码框中,我们创建了一个名为 func 的本地变量,并将 print 函数作为其值。 (请注意,不需要括号。如果您打开括号,则调用函数并获取输出值,而不是函数本身)。

块中的 if 语句检查您的函数是否存在。在Lua脚本中,不仅可以使用简单的 if 语句检查 布尔 值,还可以使用简单的 if 语句检查函数和对象的存在。

在我们的 if 块内,我们调用了我们的本地变量,就像我们调用值的全局函数(print)一样,更像是为易于使用而给我们的函数(print)取一个别名或缩写名。

2014-08-29 08:51:43
用户869951
用户869951

我认为覆盖所有可能性(对象不存在,或者存在但不是函数,或者不是函数但是可调用)最稳健的方法是使用受保护的调用来实际调用它:如果不存在,则不会真正调用任何内容;如果存在并且可调用,则会返回结果;否则不会真正调用任何内容。

function callIfCallable(f)
    return function(...)
        error, result = pcall(f, ...)
        if error then -- f 存在且可调用
            print('ok')
            return result
        end
        -- 无需操作,好像没有被调用一样,或 print('error', result)
    end
end

function f(a,b) return a+b end
f = callIfCallable(f)
print(f(1, 2)) -- 输出3
g = callIfCallable(g)
print(g(1, 2)) -- 不输出任何内容,因为不会“真正”调用它
2014-09-02 04:10:20