Lua Booleans in Lua Logical Operators

Help us to keep this website almost Ad Free! It takes only 10 seconds of your time:
> Step 1: Go view our video on YouTube: EF Core Bulk Insert
> Step 2: And Like the video. BONUS: You can also share it!

Example

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

Order of Precedence

The order of precedence is similar to the math operators unary -, * and +:

  • not
  • then and
  • then or

This 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

Short-cut Evaluation

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

Idiomatic conditional operator

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


Got any Lua Question?