2016-08-02 3 views
2
local a = {} 
local b = {} 

local c,d = (a~=nil) and 1,1 or 0,0 -- prints "1 1" 

local c,d = (a==nil) and 1,1 or 0,0 -- prints "false 1" 

print(c,d) 

Я понимаю, почему это происходит. Есть ли способ распечатать «0 0»?Lua, если заявление идиома

+1

использовать если заявление? –

+0

@Mooing Duck, я ненавижу «если заявления», они большие и уродливые. –

+1

Они также предотвращают такие глупые ошибки, как у вас в коде. Вы бы скорее сжали код или код, который действительно работает? –

ответ

5

Есть ли способ печати «0 0»?

Нет, потому что выражение and or всегда возвращает один результат, и результаты, которые вы видите, вероятно, не по той причине, что вы так считаете.

локальная, г = (а ~ = ноль) и 1,1 или 0,0 - печатает "1 1"

Это рассчитывается как ((a~=nil) and 1),(1 or 0),0. Первое выражение возвращает 1, второе (1 or 0) возвращает 1, а последнее игнорируется (так как у вас есть две переменные слева и три выражения справа).

локальная, г = (а == ноль) и 1,1 или 0,0 - печатает "ложь 1"

Это рассчитывается аналогичным образом, за исключением того, (a==nil) является false и именно поэтому вы получаете второй результат.

Чтобы сделать то, что вы хотите, вам нужно разбить его на два выражения: один для c и один для d.

0

Как отметил «Paul Кульченко» в своем последнем предложении, я в конечном итоге сложения двух идиомы ...

local a = {} 
local b = {} 

local c,d = (a~=nil) and 1 or 0, (a~=nil) and 1 or 0 -- prints "1 1" 

local c,d = (a==nil) and 1 or 0, (a==nil) and 1 or 0 -- prints "0 0" 

print(c,d) 
1

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

Вариант № 1: Возьмите таблицы:

function iff(cond, tbl1, tbl2) 
    if(cond) then 
    return unpack(tbl1) 
    else 
    return unpack(tbl2) 
    end 
end 

Очевидно, что это требует, чтобы вы всегда проходят таблицы. Если вам нужны только одиночные значения, вам понадобится вторая версия функции. Это предпочтительнее добавлять условную логику на основе типов, что замедляет ваш код.

Вариант № 2: VARIADIC:

--Number of parameters ought to be even. 
--The first half are returned if the condition is true, 
--the second half if it is false. 
function iff(cond, ...) 
    if(cond) then 
    return ... --Yes, you're returning all of them, but the user shouldn't be trying to take more than the first half. 
    else 
    return select((select("#", ...))/2, ...) 
    end 
end 
Смежные вопросы