What are Some and None?

option-type, rust

Solution

The signature of `get` (for slices, not `Vec`, since you're using an array/slice) is

fn get(&self, index: usize) -> Option<&T>

That is, it returns an `Option`, which is an enum defined like

pub enum Option<T> {
    None,
    Some(T),
}

`None` and `Some` are the variants of the enum, that is, a value with type `Option<T>` can either be a `None`, or it can be a `Some` containing a value of type `T`. You can create the `Option` enum using the variants as well:

let foo = Some(42);
let bar = None;

This is the same as the core `data Maybe a = Nothing | Just a` type in Haskell; both represent an optional value, it's either there (`Some`/`Just`), or it's not (`None`/`Nothing`).

These types are often used to represent failure when there's only one possibility for why something failed, for example, `.get` uses `Option` to give type-safe bounds-checked array access: it returns `None` (i.e. no data) when the index is out of bounds, otherwise it returns a `Some` containing the requested pointer.

See also:

- Why don't Option's Some and None variants need to be qualified?

- What is the difference between Some and Option in Rust?

Problem

I came across some output I don't understand using `Vec::get`. Here's the code: ``` fn main() { let command = [('G', 'H'), ('H', '5')]; for i in 0..3 { print!(" {} ", i); println!("{:?}", command.get(i)); } } ``` the output is ``` 0 Some(('G', 'H')) 1 Some(('H', '5')) 2 None ``` I've dabbled in Haskell before, and by that I mean looked at a tutorial site for 10 minutes and ran back to C++, but I remember reading something about `Some` and `None` for Haskell. I was surprised to see this here in Rust. Could someone explain why `.get()` returns `Some` or `None`?

Original source

Related problems