默认参数

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" 的工作原理是因为 Lua 中的 or 短路。如果 or 左侧的项目不是 nilfalse,那么右侧永远不会被评估。另一方面,如果没有参数调用 sayHello,那么 name 将是 nil,因此字符串 Jack 将被分配给 name。 (请注意,如果布尔值 false 是相关参数的合理值,则此惯用法将不起作用。)