HiveBrain v1.2.0
Get Started
← Back to all entries
patternrustCritical

What are Some and None?

Submitted by: @import:stackoverflow-api··
0
Viewed 0 times
someareandnonewhat

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?

Solution

The signature of get (for slices, not Vec, since you're using an array/slice) is
fn get(&self, index: usize) -> Option


That is, it returns an Option, which is an enum defined like
pub enum Option {
None,
Some(T),
}


None and Some are the variants of the enum, that is, a value with type Option 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?

Context

Stack Overflow Q#24771655, score: 110

Revisions (0)

No revisions yet.