2015-06-17 4 views
1

У меня есть функция, которая либо может принимать два параметра, либо вызывает другую функцию для возврата этих значений (в этом случае полу-значения по умолчанию).условное присвоение нескольких значений

Скажем, первая функция выглядит следующим образом:

-- 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 останется ноль. Я знаю, почему это происходит, но я не знаю, как выразить это условное назначение таким образом, который работает.

я мог бы сделать:

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 

В каждом случае, я только хочу, чтобы Asign по умолчанию для отсутствующего значения, а не как, если один уже имеет один.

Мой первый, хотя было что-то вроде:

bar_1, bar_2 = (param_1 or getBar()), (param_2 or _,getBar()) 

Но это не законны синтаксис.

EDIT: я мог бы сделать:

def_bar_1, def_bar_2 = getBar() 
bar_1 = param_1 or def_bar_1 
bar_2 = param_2 or def_bar_2 

Но это может быть вызов ненужной функции.

ответ

3
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 
+0

Это именно то, что я написал в EDIT-Block. возможно, ненужный functioncall. – Sempie

+0

Обновлен с другим вариантом, где 'getBar' стоит дорого. – dlask

1

Способ № 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 
Смежные вопросы