在 Lua 中,如何正确地将一个nil参数设置为默认值?

对于下面的 Lua 代码:

local function foo(x, y, z)
    local x = x or true
    local y = y or 1234
    z = z or "default"
end

我一直认为函数内的这三行代码的意思是:

如果 x/y/z 为空,则将其设置为 true/1234/"default"。否则,它将保持不变。因此,我经常在许多地方设置一个参数的默认值,以防它被传递到函数中作为 nil。

然而,在我的实验中似乎并不完全正确。我不确定我从哪里学习了这个 Lua 编程概念。正确的做法是什么?

点赞
用户1190388
用户1190388

该方法只有在布尔变量x未初始化为false时才有效。如果您仅想对nil值使用默认值,则a or b方法是正确的。

如果您的变量可以为false,则必须使用严格的if-then块:

if x == nil then x = true end

您可以在lua维基上看到关于三目运算符的更多方法/示例。

2015-03-22 00:32:45
用户2328287
用户2328287

如果您想要将 nil 作为参数传递进去 (例如,您想区分 foo(1,2,nil)foo(1,2)),则存在一种更严格的方法。

function foo(...)
  local n,x,y,z = select('#', ...), ...
  if n < 3 then z = default end
  if n < 2 then y = default end
  if n < 1 then x = default end
  -- 在这里,x,y 或 z 可以是 nil
  ...
end

但是,您必须确信自己知道自己在做什么,因为这可能不是您的函数用户所期望的行为。

2015-03-22 13:20:50
用户6256469
用户6256469

这个应该能够正常工作:

function foo(x,y,z)
    x =(x == nil)或x
    y =(y == nil and 1234or y
    z =(z == nil and“default”)or z
    print(x,y,z)
end

> foo()
true    1234    default
> foo(false, false, "me")
false   false   me
> foo(nil, 50, "me")
true    50  me
2020-05-13 13:51:13