Enum std::option::OptionStable
[-]
[+]
[src]
pub enum Option<T> {
None,
Some(T),
}The Option type.
Variants
None | No value |
Some | Some value |
Methods
impl<T> Option<T>
fn is_some(&self) -> bool
Returns true if the option is a Some value
Example
fn main() { let x: Option<uint> = Some(2); assert_eq!(x.is_some(), true); let x: Option<uint> = None; assert_eq!(x.is_some(), false); }let x: Option<uint> = Some(2); assert_eq!(x.is_some(), true); let x: Option<uint> = None; assert_eq!(x.is_some(), false);
fn is_none(&self) -> bool
Returns true if the option is a None value
Example
fn main() { let x: Option<uint> = Some(2); assert_eq!(x.is_none(), false); let x: Option<uint> = None; assert_eq!(x.is_none(), true); }let x: Option<uint> = Some(2); assert_eq!(x.is_none(), false); let x: Option<uint> = None; assert_eq!(x.is_none(), true);
fn as_ref(&'r self) -> Option<&'r T>
Convert from Option<T> to Option<&T>
Example
Convert an Option<String> into an Option<int>, preserving the original.
The map method takes the self argument by value, consuming the original,
so this technique uses as_ref to first take an Option to a reference
to the value inside the original.
let num_as_str: Option<String> = Some("10".to_string()); // First, cast `Option<String>` to `Option<&String>` with `as_ref`, // then consume *that* with `map`, leaving `num_as_str` on the stack. let num_as_int: Option<uint> = num_as_str.as_ref().map(|n| n.len()); println!("still can print num_as_str: {}", num_as_str);
fn as_mut(&'r mut self) -> Option<&'r mut T>
Convert from Option<T> to Option<&mut T>
Example
fn main() { let mut x = Some(2u); match x.as_mut() { Some(v) => *v = 42, None => {}, } assert_eq!(x, Some(42u)); }let mut x = Some(2u); match x.as_mut() { Some(v) => *v = 42, None => {}, } assert_eq!(x, Some(42u));
fn as_mut_slice(&'r mut self) -> &'r mut [T]
Convert from Option<T> to &mut [T] (without copying)
Example
fn main() { let mut x = Some("Diamonds"); { let v = x.as_mut_slice(); assert!(v == ["Diamonds"]); v[0] = "Dirt"; assert!(v == ["Dirt"]); } assert_eq!(x, Some("Dirt")); }let mut x = Some("Diamonds"); { let v = x.as_mut_slice(); assert!(v == ["Diamonds"]); v[0] = "Dirt"; assert!(v == ["Dirt"]); } assert_eq!(x, Some("Dirt"));
fn expect(self, msg: &str) -> T
Unwraps an option, yielding the content of a Some
Panics
Panics if the value is a None with a custom panic message provided by
msg.
Example
fn main() { let x = Some("value"); assert_eq!(x.expect("the world is ending"), "value"); }let x = Some("value"); assert_eq!(x.expect("the world is ending"), "value");fn main() { let x: Option<&str> = None; x.expect("the world is ending"); // panics with `world is ending` }
let x: Option<&str> = None; x.expect("the world is ending"); // panics with `world is ending`
fn unwrap(self) -> T
Returns the inner T of a Some(T).
Panics
Panics if the self value equals None.
Safety note
In general, because this function may panic, its use is discouraged.
Instead, prefer to use pattern matching and handle the None
case explicitly.
Example
fn main() { let x = Some("air"); assert_eq!(x.unwrap(), "air"); }let x = Some("air"); assert_eq!(x.unwrap(), "air");fn main() { let x: Option<&str> = None; assert_eq!(x.unwrap(), "air"); // fails }
let x: Option<&str> = None; assert_eq!(x.unwrap(), "air"); // fails
fn unwrap_or(self, def: T) -> T
Returns the contained value or a default.
Example
fn main() { assert_eq!(Some("car").unwrap_or("bike"), "car"); assert_eq!(None.unwrap_or("bike"), "bike"); }assert_eq!(Some("car").unwrap_or("bike"), "car"); assert_eq!(None.unwrap_or("bike"), "bike");
fn unwrap_or_else<F: FnOnce() -> T>(self, f: F) -> T
Returns the contained value or computes it from a closure.
Example
fn main() { let k = 10u; assert_eq!(Some(4u).unwrap_or_else(|| 2 * k), 4u); assert_eq!(None.unwrap_or_else(|| 2 * k), 20u); }let k = 10u; assert_eq!(Some(4u).unwrap_or_else(|| 2 * k), 4u); assert_eq!(None.unwrap_or_else(|| 2 * k), 20u);
fn map<U, F: FnOnce(T) -> U>(self, f: F) -> Option<U>
Maps an Option<T> to Option<U> by applying a function to a contained value
Example
Convert an Option<String> into an Option<uint>, consuming the original:
let num_as_str: Option<String> = Some("10".to_string()); // `Option::map` takes self *by value*, consuming `num_as_str` let num_as_int: Option<uint> = num_as_str.map(|n| n.len());
fn map_or<U, F: FnOnce(T) -> U>(self, def: U, f: F) -> U
Applies a function to the contained value or returns a default.
Example
fn main() { let x = Some("foo"); assert_eq!(x.map_or(42u, |v| v.len()), 3u); let x: Option<&str> = None; assert_eq!(x.map_or(42u, |v| v.len()), 42u); }let x = Some("foo"); assert_eq!(x.map_or(42u, |v| v.len()), 3u); let x: Option<&str> = None; assert_eq!(x.map_or(42u, |v| v.len()), 42u);
fn map_or_else<U, D: FnOnce() -> U, F: FnOnce(T) -> U>(self, def: D, f: F) -> U
Applies a function to the contained value or computes a default.
Example
fn main() { let k = 21u; let x = Some("foo"); assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 3u); let x: Option<&str> = None; assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 42u); }let k = 21u; let x = Some("foo"); assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 3u); let x: Option<&str> = None; assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 42u);
fn ok_or<E>(self, err: E) -> Result<T, E>
Transforms the Option<T> into a Result<T, E>, mapping Some(v) to
Ok(v) and None to Err(err).
Example
fn main() { let x = Some("foo"); assert_eq!(x.ok_or(0i), Ok("foo")); let x: Option<&str> = None; assert_eq!(x.ok_or(0i), Err(0i)); }let x = Some("foo"); assert_eq!(x.ok_or(0i), Ok("foo")); let x: Option<&str> = None; assert_eq!(x.ok_or(0i), Err(0i));
fn ok_or_else<E, F: FnOnce() -> E>(self, err: F) -> Result<T, E>
Transforms the Option<T> into a Result<T, E>, mapping Some(v) to
Ok(v) and None to Err(err()).
Example
fn main() { let x = Some("foo"); assert_eq!(x.ok_or_else(|| 0i), Ok("foo")); let x: Option<&str> = None; assert_eq!(x.ok_or_else(|| 0i), Err(0i)); }let x = Some("foo"); assert_eq!(x.ok_or_else(|| 0i), Ok("foo")); let x: Option<&str> = None; assert_eq!(x.ok_or_else(|| 0i), Err(0i));
fn iter(&self) -> Iter<T>
Returns an iterator over the possibly contained value.
Example
fn main() { let x = Some(4u); assert_eq!(x.iter().next(), Some(&4)); let x: Option<uint> = None; assert_eq!(x.iter().next(), None); }let x = Some(4u); assert_eq!(x.iter().next(), Some(&4)); let x: Option<uint> = None; assert_eq!(x.iter().next(), None);
fn iter_mut(&mut self) -> IterMut<T>
Returns a mutable iterator over the possibly contained value.
Example
fn main() { let mut x = Some(4u); match x.iter_mut().next() { Some(&ref mut v) => *v = 42u, None => {}, } assert_eq!(x, Some(42)); let mut x: Option<uint> = None; assert_eq!(x.iter_mut().next(), None); }let mut x = Some(4u); match x.iter_mut().next() { Some(&ref mut v) => *v = 42u, None => {}, } assert_eq!(x, Some(42)); let mut x: Option<uint> = None; assert_eq!(x.iter_mut().next(), None);
fn into_iter(self) -> IntoIter<T>
Returns a consuming iterator over the possibly contained value.
Example
fn main() { let x = Some("string"); let v: Vec<&str> = x.into_iter().collect(); assert_eq!(v, vec!["string"]); let x = None; let v: Vec<&str> = x.into_iter().collect(); assert!(v.is_empty()); }let x = Some("string"); let v: Vec<&str> = x.into_iter().collect(); assert_eq!(v, vec!["string"]); let x = None; let v: Vec<&str> = x.into_iter().collect(); assert!(v.is_empty());
fn and<U>(self, optb: Option<U>) -> Option<U>
Returns None if the option is None, otherwise returns optb.
Example
fn main() { let x = Some(2u); let y: Option<&str> = None; assert_eq!(x.and(y), None); let x: Option<uint> = None; let y = Some("foo"); assert_eq!(x.and(y), None); let x = Some(2u); let y = Some("foo"); assert_eq!(x.and(y), Some("foo")); let x: Option<uint> = None; let y: Option<&str> = None; assert_eq!(x.and(y), None); }let x = Some(2u); let y: Option<&str> = None; assert_eq!(x.and(y), None); let x: Option<uint> = None; let y = Some("foo"); assert_eq!(x.and(y), None); let x = Some(2u); let y = Some("foo"); assert_eq!(x.and(y), Some("foo")); let x: Option<uint> = None; let y: Option<&str> = None; assert_eq!(x.and(y), None);
fn and_then<U, F: FnOnce(T) -> Option<U>>(self, f: F) -> Option<U>
Returns None if the option is None, otherwise calls f with the
wrapped value and returns the result.
Example
fn main() { fn sq(x: uint) -> Option<uint> { Some(x * x) } fn nope(_: uint) -> Option<uint> { None } assert_eq!(Some(2).and_then(sq).and_then(sq), Some(16)); assert_eq!(Some(2).and_then(sq).and_then(nope), None); assert_eq!(Some(2).and_then(nope).and_then(sq), None); assert_eq!(None.and_then(sq).and_then(sq), None); }fn sq(x: uint) -> Option<uint> { Some(x * x) } fn nope(_: uint) -> Option<uint> { None } assert_eq!(Some(2).and_then(sq).and_then(sq), Some(16)); assert_eq!(Some(2).and_then(sq).and_then(nope), None); assert_eq!(Some(2).and_then(nope).and_then(sq), None); assert_eq!(None.and_then(sq).and_then(sq), None);
fn or(self, optb: Option<T>) -> Option<T>
Returns the option if it contains a value, otherwise returns optb.
Example
fn main() { let x = Some(2u); let y = None; assert_eq!(x.or(y), Some(2u)); let x = None; let y = Some(100u); assert_eq!(x.or(y), Some(100u)); let x = Some(2u); let y = Some(100u); assert_eq!(x.or(y), Some(2u)); let x: Option<uint> = None; let y = None; assert_eq!(x.or(y), None); }let x = Some(2u); let y = None; assert_eq!(x.or(y), Some(2u)); let x = None; let y = Some(100u); assert_eq!(x.or(y), Some(100u)); let x = Some(2u); let y = Some(100u); assert_eq!(x.or(y), Some(2u)); let x: Option<uint> = None; let y = None; assert_eq!(x.or(y), None);
fn or_else<F: FnOnce() -> Option<T>>(self, f: F) -> Option<T>
Returns the option if it contains a value, otherwise calls f and
returns the result.
Example
fn main() { fn nobody() -> Option<&'static str> { None } fn vikings() -> Option<&'static str> { Some("vikings") } assert_eq!(Some("barbarians").or_else(vikings), Some("barbarians")); assert_eq!(None.or_else(vikings), Some("vikings")); assert_eq!(None.or_else(nobody), None); }fn nobody() -> Option<&'static str> { None } fn vikings() -> Option<&'static str> { Some("vikings") } assert_eq!(Some("barbarians").or_else(vikings), Some("barbarians")); assert_eq!(None.or_else(vikings), Some("vikings")); assert_eq!(None.or_else(nobody), None);
fn take(&mut self) -> Option<T>
Takes the value out of the option, leaving a None in its place.
Example
fn main() { let mut x = Some(2u); x.take(); assert_eq!(x, None); let mut x: Option<uint> = None; x.take(); assert_eq!(x, None); }let mut x = Some(2u); x.take(); assert_eq!(x, None); let mut x: Option<uint> = None; x.take(); assert_eq!(x, None);
impl<'a, T: Clone, D: Deref<T>> Option<D>
fn cloned(self) -> Option<T>
Maps an Option
impl<T: Default> Option<T>
fn unwrap_or_default(self) -> T
Returns the contained value or a default
Consumes the self argument then, if Some, returns the contained
value, otherwise if None, returns the default value for that
type.
Example
Convert a string to an integer, turning poorly-formed strings
into 0 (the default value for integers). parse converts
a string to any other type that implements FromStr, returning
None on error.
let good_year_from_input = "1909"; let bad_year_from_input = "190blarg"; let good_year = good_year_from_input.parse().unwrap_or_default(); let bad_year = bad_year_from_input.parse().unwrap_or_default(); assert_eq!(1909i, good_year); assert_eq!(0i, bad_year);
Trait Implementations
impl<T> AsSlice<T> for Option<T>
impl<T> Default for Option<T>
impl<A, V: FromIterator<A>> FromIterator<Option<A>> for Option<V>
fn from_iter<I: Iterator<Option<A>>>(iter: I) -> Option<V>
Takes each element in the Iterator: if it is None, no further
elements are taken, and the None is returned. Should no None occur, a
container with the values of each Option is returned.
Here is an example which increments every integer in a vector, checking for overflow:
fn main() { use std::uint; let v = vec!(1u, 2u); let res: Option<Vec<uint>> = v.iter().map(|&x: &uint| if x == uint::MAX { None } else { Some(x + 1) } ).collect(); assert!(res == Some(vec!(2u, 3u))); }use std::uint; let v = vec!(1u, 2u); let res: Option<Vec<uint>> = v.iter().map(|&x: &uint| if x == uint::MAX { None } else { Some(x + 1) } ).collect(); assert!(res == Some(vec!(2u, 3u)));