【问题标题】:conditional assignment of multiple values多个值的条件赋值
【发布时间】:2015-06-17 07:03:58
【问题描述】:

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

假设第一个函数如下所示:

-- 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

不合法,因为有四种可能性,而不仅仅是两种:

 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

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

【问题讨论】:

    标签: lua variable-assignment


    【解决方案1】:
    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
    

    【讨论】:

    • 这正是我在 EDIT-Block 中所写的。可能是不必要的函数调用。
    • 更新了另一个变体,其中getBar 很昂贵。
    【解决方案2】:

    方法#1

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多