Search code examples
rustoption-type

What are Some and None?


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?


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: