多个值的条件赋值

我有一个函数,它可以接受两个参数,或调用另一个函数来检索这些值(在这种情况下为半默认)。

假设第一个函数看起来像这样:

-- 实际问题函数:
function fooparam_1param_2local bar_1bar_2 = param_1param_2getBar()

   --使用参数制作有趣的东西
   返回用参数制作的有趣的东西
end

function getBar()
   --用于获取bar的一些魔法。
   返回wxyz
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或def_bar_1
bar_2 = param_2或def_bar_2

但这可能是不必要的函数调用。

点赞
用户1881196
用户1881196
函数 foo(param_1, param_2)

   -- 获得默认值
   local p1, p2 = getBar()
   
   -- 将提供的值与默认值组合
   local bar_1, bar_2 = (param_1 or p1), (param_2 or p2)

   -- 使用 bar_1 和 bar_2 进行必要的操作

end

如果 getBar 函数调用很昂贵,并且需要尽可能避免,则必须明确说明:

函数 foo(param_1, param_2)

   local bar_1, bar_2
   if param_1 ~= nil and param_2 ~= nil then
      -- 两个参数都已知,不需要默认值
      bar_1, bar_2 = param_1, param_2
   else
      -- 至少一个参数缺失,需要调用 getBar
      local p1, p2 = getBar()
      bar_1, bar_2 = (param_1 or p1), (param_2 or p2)
   end

   -- 可以使用 bar_1 和 bar_2

end
2015-06-17 07:28:11
用户1847592
用户1847592

方法 #1

如果 param_1 和 param_2 都不存在,则执行以下操作:
获取默认值 def_bar_1,def_bar_2 = getBar()
bar_1 等于 param_1 或 def_bar_1
bar_2 等于 param_2 或 def_bar_2

方法 #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)
  -- 玩一些好玩的参数
  -- 返回用参数制作的有趣东西
end
2015-06-17 07:40:47