代码之家  ›  专栏  ›  技术社区  ›  Choosechee

有没有一种方法可以区分函数中被省略的参数和被传递的参数为零?

  •  0
  • Choosechee  · 技术社区  · 2 年前

    假设我有一个返回布尔值的函数,还有一个设置覆盖的函数,这样第一个函数总是返回指定的布尔值。第二个函数如下所示:

    function override(override, bool)
        bool = bool and true or false --convert to pure Boolean
        
        if override then
            boolOverride = bool
        else
            boolOverride = nil
        end
    end
    

    然而,我想这样做,如果没有指定bool,它就可以了 bool = not boolOverride 。所以应该是这样的:

    function override(override, bool)
        if type(bool) == "nil" then
            bool = not boolOverride
        else
            bool = bool and true or false --convert to pure Boolean
        end
        
        if override then
            boolOverride = bool
        else
            boolOverride = nil
        end
    end
    

    问题是,我希望它运行默认选项 bool = bool and true or false 如果参数具体为nil而不是不存在。我可以利用这两种情况来实现这一点,这两者之间有什么区别吗?

    1 回复  |  直到 2 年前
        1
  •  5
  •   Luatic    2 年前

    有没有一种方法可以区分函数中被省略的参数和被传递的参数为零?

    是的,有!Lua在堆栈上传递参数和返回值。“堆栈到此结束”(“none”)和“堆栈上有一个零值”之间有区别。区分这两者最简单的方法是使用 select("#", ...) ,它为您提供堆栈上剩余值的计数。让我们写一个简单的函数,如果用一个参数调用,它会做一件事,如果用无参数/“nothing”(空vararg)调用,则会做另一件事;否则会出错:

    function f(...)
        local n = select("#", ...)
        if n == 0 then print"nothing"
        elseif n == 1 then print(...)
        else error"too many arguments" end
    end
    f() -- nothing
    f(nil) -- nil
    f(1, 2) -- errors with "too many arguments"
    
    推荐文章