Advent of Rust Day 5 - Have your bounds and eat them too!

This is a series where I’ll be discussing interesting Rust tidbits that I encounter when solving Advent of Code 2017.

You can find the complete (spoiler) solution here: udoprog/rust-advent-of-code-2017

Attempting to access data that is out of bounds in a collections could potentially ruin your day.

To combat this, rust provides ‘safe’ alternatives for slice indexing in the form of get and get_mut.

Note: these are available on Vec because it implements Deref<Target = [T]>, which causes rust to look for methods there as well.

These return an Option<&T> and Option<&mut T>, requiring you to check that the provided index was present, before attempting to deal with the data.

So this:

let mut v = vec![1, 2, 2];
println!("data = {}", v[2]);

Becomes this:

let mut v = vec![1, 2, 2];

match v.get(2) {
  Some(value) => println!("data = {}", value),
  None => println!("no value present :("),
}