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
?
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: