Короткий ответ
да
Looooong ответ
Вы правы.В то время как в других языках логические операторы возвращают либо true
, либо false
, Lua (и некоторые другие языки) делает что-то более умное:
Когда первый параметр or
верен, он оценивается какэто значение, если это не так, оно оценивается как второе.И делает это наоборот: если его левая сторона ложная, он оценивает это, в противном случае он оценивает свою RHS.
Логически это означает, что or
оценивает как истинный, если любой из операндовявляется правдивым и and
оценивается как ложный, если любой из его операндов равен.
Это часто используется как эквивалент
if value then
name = value
else
name = 0
end
И он фактически делает то же самое.Также часто используется для присвоения значений по умолчанию переменным, как это:
function call(name)
name = name or "you"
print("Hey "..name.."! Come here for a moment!")
end
Обратите внимание, что это не работает
function alarm(real)
real = real or true
print "ALAAARM!"
if real then print "This is NOT a drill!" end
end
alarm(false)
Это всегда выдает «ALAAARM!»«Это НЕ тренировка!», Потому что false
оценивается как ложное, поэтому оператор or
оценивает его RHS, равное true
.В этом конкретном примере вам придется явно проверить, является ли аргумент nil.
-- ...
real = (real == nil) and true or real
-- ...
Это будет работать как задумано, потому что только если real == nil
, оператор and
оценивается как true
,и or
, таким образом, оценивается как его LHS.Если real == nil
равно false
, то and
оценивает это, таким образом, оператор or оценивает его RHS (потому что его LHS false
).
Стоит также отметить, что оба and
и or
закорочены.Это означает:
function foo(bar)
print(bar)
return bar
end
io.write "First: "
local A = foo(nil) or foo(false)
io.write "Second: "
local B = foo(true) or foo(true)
В первых двух строках будет напечатано «First: nil false», а в третьей - «Second: true».Последний вызов foo
даже не выполняется, потому что в этот момент оператор or
уже знает, что собирается вернуть свой левый операнд.