Warning
Array functionality is still very basic as you cannot resize arrays (incl. pushing elements) at runtime. You can only get, set, and replace array elements. Future releases of Mun will extend this functionality.
Dynamically Sized Arrays
In Mun, the default array type is dynamically sized and heap-allocated. To create an array, write its values as a comma-separated list inside square brackets, as shown in Listing 3-1.
let array = [1, 2, 3, 4, 5];
An array's type is written using square brackets around the type of each element, as demonstrated in Listing 3-2. This is only necessary when the compiler cannot automatically deduce the type of the array based on the context; although you you can always manually notate your code.
let array: [u64] = [1, 2, 3, 4, 5];
Accessing Array Elements
An array is a single chunk of heap-allocated memory of dynamic size. You can access elements of an array using indexing, as illustrated in Listing 3-3.
fn main() {
let array = [1, 2, 3, 4, 5];
let first = array[0];
let second = array[1];
}
In this example, the variable named first
will get the value 1
, because that is the value at index [0]
in the array.
The variable named second
will get the value 2
from index [1]
in the array.
Invalid Array Element Access
Warning
Mun is still in early development and should thus be considered unsafe! In particular for arrays, as they're allowed to perform out-of-bounds memory access.
Currently, Mun does not check for invalid array element access. As such, it will attempt to access an array element, even if it is out of bounds. You will have to manually prevent out-of-bounds access; e.g. as shown in Listing 3-4.
pub fn generate() -> [u64] {
[5, 4, 3, 2, 1]
}
pub fn add_one(array: [u64], len: usize) -> [u64] {
let idx = 0;
loop {
array[idx] += 1;
idx += 1;
if idx >= len {
break array
}
}
}
fn main() {
add_one(generate(), 5);
}
When Mun implements a way to panic, this will change.