Introduction
Mojo provides a type system that balances performance and clarity. One of the key concepts developers encounter early is the distinction between value types and reference types. Understanding how data is copied, shared, or mutated is essential when writing reliable and efficient Mojo code. This article explores how Mojo treats values and references and why it matters in practical programming.
1. What Are Value Types?
Value types store data directly. When a value type is assigned to another variable or passed into a function, a copy is made. Changes to one copy do not affect the other.
var x: Int = 10
var y = x
y = 20
print(x) # 10
print(y) # 20
In this example, y
receives a copy of x
. Modifying y
does not alter x
.
2. What Are Reference Types?
Reference types store a reference to data in memory. When a reference type is assigned or passed, it still points to the original data. Changes through one reference affect the other.
from python import import_module
let list_module = import_module("builtins")
let a = list_module.list([1, 2, 3])
let b = a
b.append(4)
print(a) # [1, 2, 3, 4]
print(b) # [1, 2, 3, 4]
Both a
and b
point to the same list object. Mutations through one name affect the shared data.
3. Why This Distinction Matters
Knowing whether you’re dealing with a value or a reference has direct consequences on:
- Performance: Value types are faster to copy, reference types are cheaper for large data.
- Mutation: Unexpected side effects are common with references if you’re not careful.
- Function design: You can control whether a parameter should be modified or isolated.
4. Structs Are Value Types
In Mojo, struct
behaves like a value type by default.
struct Point:
var x: Int
var y: Int
let p1 = Point(1, 2)
let p2 = p1
p2.x = 100
print(p1.x) # 1
print(p2.x) # 100
Here, p2
is a copy of p1
. Changes to p2
do not affect p1
.
5. Passing by Reference with inout
Mojo allows explicit mutation of values in functions using the inout
keyword.
fn increment(inout n: Int):
n = n + 1
var a = 5
increment(a)
print(a) # 6
This provides control over when a value should be mutated versus copied.
6. Avoiding Common Pitfalls
- Don’t assume assignment means shared state—it depends on the type.
- Use
inout
only when mutation is truly needed. - Be mindful when mixing Python reference types and Mojo value types.
Conclusion
The distinction between value and reference types is a fundamental part of programming in Mojo. It affects how data is passed, how changes propagate, and how code behaves under the hood. By understanding these concepts, you can write code that is safer, more predictable, and easier to maintain.
Basic Mojo syntax (variables, types, operators): Working with Structs and Methods in Mojo
Comment