Lua 默认参数

示例

function sayHello(name)
    print("Hello, " .. name .. "!")
end

该功能是一个简单的功能,并且效果很好。但是,如果我们刚刚打电话会发生什么sayHello()呢?

stdin:2: attempt to concatenate local 'name' (a nil value)
stack traceback:
    stdin:2: in function 'sayHello'
    stdin:1: in main chunk
    [C]: in ?

那不是很好。有两种解决方法:

  1. 您立即从函数返回:

    function sayHello(name)
     if not (type(name) == "string") then
       return nil, "argument #1: expected string, got " .. type(name)
     end -- Bail out if there's no name.
     -- in lua it is a convention to return nil followed by an error message on error
     print("Hello, " .. name .. "!") -- Normal behavior if name exists.
    end
  2. 您设置默认参数。

    为此,只需使用此简单表达式

function sayHello(name)
    name = name or "Jack" -- Jack is the default, 
                          -- but if the parameter name is given, 
                          -- name will be used instead
    print("Hello, " .. name .. "!")
end

这个成语name = name or "Jack"之所以有效,是因为or在Lua中发生短路。如果左侧的项目or不是nil或false,则永远不会评估右侧。另一方面,如果sayHello不带参数调用,name则将为nil,因此将字符串"Jack"分配给name。(因此请注意,如果布尔false值是所讨论参数的合理值,则该惯用语将无效。)