多个值的条件赋值
conditional assignment of multiple values
我有一个函数可以接受两个参数,或者调用另一个函数来检索这些值(在这种情况下为半默认值)。
假设第一个函数如下所示:
-- the actuall issue function:
function foo( param_1, param_2 )
local bar_1, bar_2 = param_1, param_2 or getBar()
-- make funny stuff with parameters
return funnyStuffMadeWithParameters
end
function getBar()
-- some magic to get bar.
return wx , yz
end
在这段代码中,如果没有给出参数,bar_2 将变为 wx 而 bar_1 将保持为 nil。我知道为什么会这样,但我不知道如何以有效的方式表达这个条件赋值。
我能做到:
local bar_1 = getBar()
local _,bar_2 = getBar()
但我想避免多次函数调用。
还有
if not bar_1 or not bar_2 then
bar_1, bar_2 = getBar()
end
不合法,因为有 4 种可能性,而不仅仅是两种:
bar_1 == nil and bar_2 == nil
bar_1 == nil and bar_2 has value
bar_1 has value and bar_2 is nil
bar_1 has value and bar_2 has value
在每种情况下,我只想将默认值分配给缺失值,而不是两者都分配给缺失值。
我的第一个想法是这样的:
bar_1, bar_2 = (param_1 or getBar() ), (param_2 or _,getBar() )
但这不是合法的语法。
编辑:
我能做到:
def_bar_1, def_bar_2 = getBar()
bar_1 = param_1 or def_bar_1
bar_2 = param_2 or def_bar_2
但这可能是一个不必要的函数调用。
function foo(param_1, param_2)
-- obtain the default values
local p1, p2 = getBar()
-- combine the provided values with default values
local bar_1, bar_2 = (param_1 or p1), (param_2 or p2)
-- do whatever you need with bar_1 and bar_2
end
如果 getBar
函数调用开销很大,应该尽可能避免,那么有必要明确说明:
function foo(param_1, param_2)
local bar_1, bar_2
if param_1 ~= nil and param_2 ~= nil then
-- both parameters are known, we don't need default values
bar_1, bar_2 = param_1, param_2
else
-- at least one parameter is missing, the getBar call is unavoidable
local p1, p2 = getBar()
bar_1, bar_2 = (param_1 or p1), (param_2 or p2)
end
-- bar_1 and bar_2 can be used
end
方法一
if not (param_1 and param_2) then
local def_bar_1, def_bar_2 = getBar()
bar_1 = param_1 or def_bar_1
bar_2 = param_2 or def_bar_2
end
方法 #2,仅适用于 Lua 5.3
function foo(param_1, param_2)
local def
local bar_1, bar_2 = table.unpack(setmetatable({param_1, param_2}, {__index =
function(t,k)
def = def or {getBar()};
return def[k]
end
}), 1, 2)
-- make funny stuff with parameters
-- return funnyStuffMadeWithParameters
end
我有一个函数可以接受两个参数,或者调用另一个函数来检索这些值(在这种情况下为半默认值)。
假设第一个函数如下所示:
-- the actuall issue function:
function foo( param_1, param_2 )
local bar_1, bar_2 = param_1, param_2 or getBar()
-- make funny stuff with parameters
return funnyStuffMadeWithParameters
end
function getBar()
-- some magic to get bar.
return wx , yz
end
在这段代码中,如果没有给出参数,bar_2 将变为 wx 而 bar_1 将保持为 nil。我知道为什么会这样,但我不知道如何以有效的方式表达这个条件赋值。
我能做到:
local bar_1 = getBar()
local _,bar_2 = getBar()
但我想避免多次函数调用。 还有
if not bar_1 or not bar_2 then
bar_1, bar_2 = getBar()
end
不合法,因为有 4 种可能性,而不仅仅是两种:
bar_1 == nil and bar_2 == nil
bar_1 == nil and bar_2 has value
bar_1 has value and bar_2 is nil
bar_1 has value and bar_2 has value
在每种情况下,我只想将默认值分配给缺失值,而不是两者都分配给缺失值。
我的第一个想法是这样的:
bar_1, bar_2 = (param_1 or getBar() ), (param_2 or _,getBar() )
但这不是合法的语法。
编辑: 我能做到:
def_bar_1, def_bar_2 = getBar()
bar_1 = param_1 or def_bar_1
bar_2 = param_2 or def_bar_2
但这可能是一个不必要的函数调用。
function foo(param_1, param_2)
-- obtain the default values
local p1, p2 = getBar()
-- combine the provided values with default values
local bar_1, bar_2 = (param_1 or p1), (param_2 or p2)
-- do whatever you need with bar_1 and bar_2
end
如果 getBar
函数调用开销很大,应该尽可能避免,那么有必要明确说明:
function foo(param_1, param_2)
local bar_1, bar_2
if param_1 ~= nil and param_2 ~= nil then
-- both parameters are known, we don't need default values
bar_1, bar_2 = param_1, param_2
else
-- at least one parameter is missing, the getBar call is unavoidable
local p1, p2 = getBar()
bar_1, bar_2 = (param_1 or p1), (param_2 or p2)
end
-- bar_1 and bar_2 can be used
end
方法一
if not (param_1 and param_2) then
local def_bar_1, def_bar_2 = getBar()
bar_1 = param_1 or def_bar_1
bar_2 = param_2 or def_bar_2
end
方法 #2,仅适用于 Lua 5.3
function foo(param_1, param_2)
local def
local bar_1, bar_2 = table.unpack(setmetatable({param_1, param_2}, {__index =
function(t,k)
def = def or {getBar()};
return def[k]
end
}), 1, 2)
-- make funny stuff with parameters
-- return funnyStuffMadeWithParameters
end