【问题标题】:Lua only call a function if it exists?Lua 只调用一个函数,如果它存在?
【发布时间】:2014-10-13 18:25:01
【问题描述】:

我想在 Lua 文件中调用一个函数,但前提是该函数存在, 怎么做呢?

【问题讨论】:

    标签: function lua


    【解决方案1】:

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

    【讨论】:

    • 如果你只想在 foo 定义在那里的情况下加载文件,那么这要困难得多,如果不是不可能的话。
    • 在这种情况下 foo 也可能是一个字符串、数字或表格。最好测试一下 type(foo) == 'function' then foo() end
    • 没想到,你是对的。所以正确的条件要困难得多,不是吗? if type(foo)=='function' or (type(foo)=='table' and getmetatable(foo).__call ~= nil) then foo() end btw: 如何在 cmets 中格式化代码片段?
    • @Maze,还有用户数据要处理。如果你允许调试库,那么所有类型都可以有__call 元方法。我认为最简单的解决方案是最好的。
    【解决方案2】:

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

    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
    

    【讨论】:

      【解决方案3】:

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

      if not foo then
          foo()
      end
      

      【讨论】:

        【解决方案4】:

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

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2015-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-14
          • 2021-12-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多