Lua中,如何正确设置一个nil参数为默认值?
In Lua, how to set a nil parameter to some default value correctly?
对于 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 为 nil,则 x/y/z 设置为 true/1234/"default"。否则,它将保持原样。因此,我在很多地方都有这样一行,用于将参数设置为某个默认值,以防它可能作为 nil 传递给函数。
但是,在我的实验中似乎并不完全正确。我不确定我是从哪里学到这个 Lua 编码概念的。如何正确操作?
只要您的布尔 (?) 变量 x
未初始化为 false
,该方法就可以工作。如果您只想对 nil
值使用默认值,则 a or b
方法是正确的。
如果您的变量可以是 false
,则必须使用严格的 if-then 块:
if x == nil then x = true end
您可以在 lua wiki.
上看到更多关于三元运算符的 methods/examples
如果您希望能够将 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
-- here x,y or z can be nil
...
end
但是您必须确保自己知道自己在做什么,因为对于您的函数的用户而言,这可能不是预期的行为。
这应该按预期工作:
function foo(x, y, z)
x = (x == nil) or x
y = (y == nil and 1234) or 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
对于 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 为 nil,则 x/y/z 设置为 true/1234/"default"。否则,它将保持原样。因此,我在很多地方都有这样一行,用于将参数设置为某个默认值,以防它可能作为 nil 传递给函数。
但是,在我的实验中似乎并不完全正确。我不确定我是从哪里学到这个 Lua 编码概念的。如何正确操作?
只要您的布尔 (?) 变量 x
未初始化为 false
,该方法就可以工作。如果您只想对 nil
值使用默认值,则 a or b
方法是正确的。
如果您的变量可以是 false
,则必须使用严格的 if-then 块:
if x == nil then x = true end
您可以在 lua wiki.
上看到更多关于三元运算符的 methods/examples如果您希望能够将 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
-- here x,y or z can be nil
...
end
但是您必须确保自己知道自己在做什么,因为对于您的函数的用户而言,这可能不是预期的行为。
这应该按预期工作:
function foo(x, y, z)
x = (x == nil) or x
y = (y == nil and 1234) or 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