In Lua, booleans can be manipulated through logical operators. These operators include not, and, and or.
In simple expressions, the results are fairly straightforward:
print(not true) --> false
print(not false) --> true
print(true or false) --> true
print(false and true) --> false
The order of precedence is similar to the math operators unary -, * and +:
notandorThis can lead to complex expressions:
print(true and false or not false and not true)
print( (true and false) or ((not false) and (not true)) )
--> these are equivalent, and both evaluate to false
The operators and and or might only be evaluated using the first operand, provided the second is unnecessary:
function a()
print("a() was called")
return true
end
function b()
print("b() was called")
return false
end
print(a() or b())
--> a() was called
--> true
-- nothing else
print(b() and a())
--> b() was called
--> false
-- nothing else
print(a() and b())
--> a() was called
--> b() was called
--> false
Due to the precedence of the logical operators, the ability for short-cut evaluation and the evaluation of non-false and non-nil values as true, an idiomatic conditional operator is available in Lua:
function a()
print("a() was called")
return false
end
function b()
print("b() was called")
return true
end
function c()
print("c() was called")
return 7
end
print(a() and b() or c())
--> a() was called
--> c() was called
--> 7
print(b() and c() or a())
--> b() was called
--> c() was called
--> 7
Also, due to the nature of the x and a or b structure, a will never be returned if it evaluates to false, this conditional will then always return b no matter what x is.
print(true and false or 1) -- outputs 1