← Back to the index page

Types in Lua: References vs Values

Sometimes it is confusing for beginners to understand how the argument is passed to a function. Usually, there are the phrases “passed by reference” and “passed by value” without a concrete explanation. It is my attempt to explain the topic in very simple terms.

Lua is a dynamically typed language

First of all, Lua is a dynamically typed language. This means that variables do not have types; only values do. All values in Lua are first-class citizens, which means that all values can be stored in variables and passed to functions as arguments.

Types in Lua

There are eight (8) basic types in Lua: nil, boolean, number, string, table, function, userdata and thread.

Values with types: table, function, userdata and thread are objects, these do not contain values, but only the reference (location, address) in the computer’s memory. The variables with these four (4) types are passed by reference.

Consider:

local t = { hello = "world" }
print(t) --> table: 0x55d95d5136f0

0x55d95d5136f0 is the address in the memory.

Correspondingly values with type: nil, boolean, number and string are passed by value

Pass by value

Values with type: nil, boolean, number and string are passed by value.

Consider:

local x = 10 -- number

local function double(x)
    x = x * 2
    return x
end

print(x) -- 10
print(double(x)) -- 20
print(x) -- 10 (not changed)

When we pass by value, the initial value of x has not changed (not mutated), the value is just copied into the argument.

Pass by reference

We know that values with types: table, function, userdata and thread are passed by reference because these do not contain values only the addresses in the memory.

Consider:

local t = {}

local function addToTable(t, v)
    t[#t + 1] = v
end

-- initially empty table
print(#t, t[#t]) --> 0  nil

-- pass table as the first argument
addToTable(t, "some value")

-- here the initial t is changed (mutated)
print(#t, t[#t]) --> 1  "some value"

The reference type table holds the address in memory. After the change, the address in memory stays unchanged, but the content in memory is changed (mutated).

Table to memoize

ValueReference
niltable
booleanfunction
stringthread
numberuserdata

Conclusion

For a better understanding of this topic it is strongly recommended (maybe read even several times) the corresponding topic in Lua manual.

References

Feedback

For feedback, please check the contacts section. Before writing, please specify where you came from and who you are. Sometimes spammers go insane. Thank you in advance for your understanding.

← Back to the index page