A Rust slice is a data type used to access portions of data stored in collections like arrays, vectors and strings.
Suppose we have an array,
let numbers = [1, 2, 3, 4, 5];
Now, if we want to extract the 2nd and 3rd elements of this array. We can slice the array like this,
let slice = &array[1..3];
Here, let's look at the right-hand side of the expression,
&numbers
- specifies a reference to the variablenumbers
(not the actual value)[1..3]
- is a notation for slicing the array from start_index1
(inclusive) to end_index3
(exclusive)
Example: Rust Slice
fn main() {
// an array of numbers
let numbers = [1, 2, 3, 4, 5];
// create a slice of 2nd and 3rd element
let slice = &numbers[1..3];
println!("array = {:?}", numbers);
println!("slice = {:?}", slice);
}
Output
array = [1, 2, 3, 4, 5] slice = [2, 3]
Note: A slice is not the actual data like integers or floats but a reference/pointer to the data block. That's why we have used the &
symbol before the variable name.
Omit Indexes of a Rust Slice
While slicing a data collection, Rust allows us to omit either the start index or the end index or both from its syntax.
&variable[start_index..end_index];
For example,
1. Omitting the Start Index of a Slice
fn main() {
let numbers = [1, 2, 3, 4, 5];
// omit the start index
let slice = &numbers[..3];
println!("array = {:?}", numbers);
println!("slice = {:?}", slice);
}
Output
array = [1, 2, 3, 4, 5] slice = [1, 2, 3]
Here, &numbers[..3]
includes ..3
without the start index. This means the slice starts from index 0
and goes up to index 3
(exclusive). It is equivalent to &numbers[0..3]
.
2. Omitting the End Index of a Slice
fn main() {
let numbers = [1, 2, 3, 4, 5];
// omit the end index
let slice = &numbers[2..];
println!("array = {:?}", numbers);
println!("slice = {:?}", slice);
}
Output
array = [1, 2, 3, 4, 5] slice = [3, 4, 5]
Here, &numbers[2..]
includes 2..
without the end index. This means the slice starts from index 2
and goes up to index 5
(exclusive). It is equivalent to &numbers[2..5]
.
3. Omitting both Start and End Index of a Slice
fn main() {
let numbers = [1, 2, 3, 4, 5];
// omit the start index and the end index
// reference the whole array
let slice = &numbers[..];
println!("array = {:?}", numbers);
println!("slice = {:?}", slice);
}
Output
array = [1, 2, 3, 4, 5] slice = [1, 2, 3, 4, 5]
Here, &numbers[..]
includes ..
without the start and end index. This means the slice starts from index 0
and goes up to index 5
(exclusive).
It is equivalent to &numbers[0..5]
which will produce the same slice and will reference the whole array.
Mutable Slice in Rust
We can create a mutable slice by using the &mut
keyword.
let numbers = [1, 2, 3, 4, 5];
let slice = &mut numbers[1..4];
Once the slice is marked as mutable, we can change values inside the slice. Let's see an example,
fn main() {
// mutable array
let mut colors = ["red", "green", "yellow", "white"];
println!("array = {:?}", colors);
// mutable slice
let sliced_colors = &mut colors[1..3];
println!("original slice = {:?}", sliced_colors);
// change the value of the original slice at the first index
sliced_colors[1] = "purple";
println!("changed slice = {:?}", sliced_colors);
}
Output
array = ["red", "green", "yellow", "white"] original slice = ["green", "yellow"] changed slice = ["green", "purple"]
Here, we have created a mutable array colors. Then, we have created a mutable slice sliced_colors with &mut array[1..3]
.
Now, we can change the content of the mutable slice,
sliced_colors[1] = "purple"
We change the value of original slice sliced_colors at the 1st index from "yellow"
to "purple"
.
Frequently Asked Questions
Just like an array, we can also slice a string in Rust. For example,
fn main() {
let string = String::from("Hello World!");
// slicing a string
let slice = &string[0..5];
println!("string = {}", string);
println!("slice = {}", slice);
}
Output
string = Hello World! slice = Hello
To learn more about strings in Rust, visit Rust String.
Creating a slice from a vector is very similar to how we slice an array. For example,
fn main() {
let vector = vec!['A', 'E', 'I', 'O', 'U'];
// slicing a vector
let slice = &vector[1..4];
println!("vector = {:?}", vector);
println!("slice = {:?}", slice);
}
Output
vector = ['A', 'E', 'I', 'O', 'U'] slice = ['E', 'I', 'O']
To learn more about vectors in Rust, visit Rust Vector.