預設引數

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 是相關引數的合理值,則此慣用法將不起作用。)