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
Function Lua是否只调用存在的函数?_Function_Lua - Fatal编程技术网

Function Lua是否只调用存在的函数?

Function Lua是否只调用存在的函数?,function,lua,Function,Lua,我想调用Lua文件中的函数,但前提是该函数存在, 如何执行此操作?尝试如果foo~=nil,则foo()end非实例化变量被解释为nil,因此下面是另一种可能性 if not foo then foo() end 如果您的字符串可能是全局函数的名称: local func = "print" if _G[func] then _G[func]("Test") -- same as: print("test") end 如果您有一个可能有效的函数: local func =

我想调用Lua文件中的函数,但前提是该函数存在,
如何执行此操作?

尝试
如果foo~=nil,则foo()end
非实例化变量被解释为
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
如果您想知道发生了什么以及上面的背景是什么,
\u G
是lua上的一个全局表,它存储其中的所有全局函数。此表按名称(键)和值(函数、数字、字符串)存储全局变量。如果您的
\u G
表不包含您要查找的对象的名称,则您的对象可能不存在或是本地对象

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

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


if
块中,我们调用
local
变量,就像调用值的全局函数(
print
)一样,这更像是给函数(
print
)一个第二个名称或快捷方式名称,以便使用

我认为涵盖所有可能性(对象不存在,或它存在但不是函数,或不是函数但可调用)的最健壮的方法是使用受保护的调用来实际调用它:如果它不存在,则不会真正调用任何对象,如果它存在且可调用,则返回结果,否则就什么都不叫了

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

如果您只想在那里定义了
foo
的情况下加载文件,那么这即使不是不可能的,也是非常困难的。在这种情况下,foo也可能是字符串、数字或表格。如果类型(foo)=‘function’,那么最好测试foo()是否没有想到这一点,你是对的。所以正确的条件是更难的,不是吗?如果类型(foo)='function'或(类型(foo)='table'和getmetatable(foo)。\uu call~=nil)那么foo()结束顺便问一下:如何格式化注释中的代码片段?@Maze,还有用户数据要处理。如果您允许调试库,那么所有类型都可以有
\u调用
元方法。我认为最简单的解决办法是最好的。