如果存在,Lua只调用一个函数?

时间:2014-08-20 11:51:18

标签: function lua

我想在Lua文件中调用函数,但仅当函数存在时, 怎么会这样做?

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

我认为最强大的涵盖所有可能性(对象不存在,或者它存在但不是函数,或者不是函数但可以调用),是使用受保护的调用来实际调用它:如果它不存在则没有真正被调用,如果它存在并且可调用,则返回结果,否则没有真正被调用。

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

答案 2 :(得分:1)

非实例化变量被解释为nil,所以下面是另一种可能性。

if not foo then
    foo()
end

答案 3 :(得分:0)

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

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表不包含您要查找的对象的名称,那么您的对象可能不存在或者它是本地对象。

在第二个代码框中,我们正在创建一个名为local的{​​{1}}变量,并将func函数作为值。 (请注意,不需要括号。如果打开括号,它会调用函数并获取输出值,而不是自己的函数)。

块上的print语句,检查您的函数是否存在。在lua脚本中,不仅可以使用简单的if语句检查booleans,而且可以使用简单的if语句检查函数和对象的存在。

在我们的if块中,我们调用我们的if变量,就像我们调用值(local)的全局函数一样,它更像是给我们的函数({ {1}})便于使用的第二个名称或快捷方式名称。