Enum core::option::Option 1.0.0[−][src]
pub enum Option<T> { None, Some(T), }
Expand description
Option
类型。有关更多信息,请参见 模块级文档。
Variants
没有值
一些值 T
Implementations
从 &Option<T>
转换为 Option<&T>
。
Examples
将 Option<
String
>
转换为 Option<
usize
>
,并保留原始格式。
map
方法按值使用 self
参数,从而消耗了原始文件,因此该技术使用 as_ref
首先将 Option
引用给原始文件中的值。
let text: Option<String> = Some("Hello, world!".to_string()); // 首先,使用 `as_ref` 将 `Option<String>` 转换为 `Option<&String>`,然后使用 `map` 消耗 *that*,将 `text` 保留在栈中。 let text_length: Option<usize> = text.as_ref().map(|s| s.len()); println!("still can print text: {:?}", text);Run
返回包含 self
值的包含的 Some
值。
由于此函数可能为 panic,因此通常不建议使用该函数。
相反,更喜欢使用模式匹配并显式处理 None
大小写,或者调用 unwrap_or
,unwrap_or_else
或 unwrap_or_default
。
Panics
如果自身值等于 None
,则为 Panics。
Examples
let x = Some("air"); assert_eq!(x.unwrap(), "air");Run
let x: Option<&str> = None; assert_eq!(x.unwrap(), "air"); // failsRun
返回包含的 Some
值或提供的默认值。
急切地评估传递给 unwrap_or
的参数; 如果要传递函数调用的结果,建议使用 unwrap_or_else
,它是惰性求值的。
Examples
assert_eq!(Some("car").unwrap_or("bike"), "car"); assert_eq!(None.unwrap_or("bike"), "bike");Run
🔬 This is a nightly-only experimental API. (option_result_unwrap_unchecked
#81383)
newly added
🔬 This is a nightly-only experimental API. (option_result_unwrap_unchecked
#81383)
newly added
返回包含 self
值的包含的 Some
值,而不检查该值是否不是 None
。
Safety
在 None
上调用此方法是 undefined behavior。
Examples
#![feature(option_result_unwrap_unchecked)] let x = Some("air"); assert_eq!(unsafe { x.unwrap_unchecked() }, "air");Run
#![feature(option_result_unwrap_unchecked)] let x: Option<&str> = None; assert_eq!(unsafe { x.unwrap_unchecked() }, "air"); // 未定义的行为!Run
通过将函数应用于包含的值,Maps 将 Option<T>
转换为 Option<U>
。
Examples
使用原始文件将 Option<
String
>
转换为 Option<
usize
>
:
let maybe_some_string = Some(String::from("Hello, World!")); // `Option::map` 需要 self 按照值消耗 `maybe_some_string` let maybe_some_len = maybe_some_string.map(|s| s.len()); assert_eq!(maybe_some_len, Some(13));Run
返回提供的默认结果 (如果没有),或将函数应用于包含的值 (如果有)。
急切地评估传递给 map_or
的参数; 如果要传递函数调用的结果,建议使用 map_or_else
,它是延迟计算的。
Examples
let x = Some("foo"); assert_eq!(x.map_or(42, |v| v.len()), 3); let x: Option<&str> = None; assert_eq!(x.map_or(42, |v| v.len()), 42);Run
将 Option<T>
转换为 Result<T, E>
,将 Some(v)
映射到 Ok(v)
,将 None
映射到 Err(err)
。
急切地评估传递给 ok_or
的参数; 如果要传递函数调用的结果,建议使用 ok_or_else
,它是延迟计算的。
Examples
let x = Some("foo"); assert_eq!(x.ok_or(0), Ok("foo")); let x: Option<&str> = None; assert_eq!(x.ok_or(0), Err(0));Run
将 Option<T>
转换为 Result<T, E>
,将 Some(v)
映射到 Ok(v)
,将 None
映射到 Err(err())
。
Examples
let x = Some("foo"); assert_eq!(x.ok_or_else(|| 0), Ok("foo")); let x: Option<&str> = None; assert_eq!(x.ok_or_else(|| 0), Err(0));Run
如果选项为 None
,则返回 None
; 否则,返回 optb
。
Examples
let x = Some(2); let y: Option<&str> = None; assert_eq!(x.and(y), None); let x: Option<u32> = None; let y = Some("foo"); assert_eq!(x.and(y), None); let x = Some(2); let y = Some("foo"); assert_eq!(x.and(y), Some("foo")); let x: Option<u32> = None; let y: Option<&str> = None; assert_eq!(x.and(y), None);Run
如果选项为 None
,则返回 None
; 否则,使用包装的值调用 f
,并返回结果。
一些语言调用此操作平面图。
Examples
fn sq(x: u32) -> Option<u32> { Some(x * x) } fn nope(_: u32) -> Option<u32> { 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);Run
如果选项为 None
,则返回 None
; 否则,使用包装的值调用 predicate
并返回:
该函数的工作方式类似于 Iterator::filter()
。
您可以想象 Option<T>
是一个或零个元素上的迭代器。
filter()
让您决定要保留哪些元素。
Examples
fn is_even(n: &i32) -> bool { n % 2 == 0 } assert_eq!(None.filter(is_even), None); assert_eq!(Some(3).filter(is_even), None); assert_eq!(Some(4).filter(is_even), Some(4));Run
如果包含值,则返回选项,否则返回 optb
。
急切地评估传递给 or
的参数; 如果要传递函数调用的结果,建议使用 or_else
,它是延迟计算的。
Examples
let x = Some(2); let y = None; assert_eq!(x.or(y), Some(2)); let x = None; let y = Some(100); assert_eq!(x.or(y), Some(100)); let x = Some(2); let y = Some(100); assert_eq!(x.or(y), Some(2)); let x: Option<u32> = None; let y = None; assert_eq!(x.or(y), None);Run
如果选项包含值,则返回该选项,否则调用 f
并返回结果。
Examples
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);Run
如果 self
,optb
之一恰好是 Some
,则返回 Some
,否则返回 None
。
Examples
let x = Some(2); let y: Option<u32> = None; assert_eq!(x.xor(y), Some(2)); let x: Option<u32> = None; let y = Some(2); assert_eq!(x.xor(y), Some(2)); let x = Some(2); let y = Some(2); assert_eq!(x.xor(y), None); let x: Option<u32> = None; let y: Option<u32> = None; assert_eq!(x.xor(y), None);Run
将 value
插入选项,然后向其返回变量引用。
如果该选项已包含值,则将丢弃旧值。
另请参见 Option::get_or_insert
,如果选项已包含 Some
,则不会更新值。
Example
let mut opt = None; let val = opt.insert(1); assert_eq!(*val, 1); assert_eq!(opt.unwrap(), 1); let val = opt.insert(2); assert_eq!(*val, 2); *val = 3; assert_eq!(opt.unwrap(), 3);Run
如果为 None
,则将 value
插入到选项中,然后返回所包含的值的变量引用。
另请参见 Option::insert
,即使选项已包含 Some
,它也会更新值。
Examples
let mut x = None; { let y: &mut u32 = x.get_or_insert(5); assert_eq!(y, &5); *y = 7; } assert_eq!(x, Some(7));Run
pub fn zip_with<U, F, R>(self, other: Option<U>, f: F) -> Option<R> where
F: FnOnce(T, U) -> R,
[src]
pub fn zip_with<U, F, R>(self, other: Option<U>, f: F) -> Option<R> where
F: FnOnce(T, U) -> R,
[src]使用函数 f
压缩 self
和另一个 Option
。
如果 self
是 Some(s)
,而 other
是 Some(o)
,则此方法返回 Some(f(s, o))
。
否则,返回 None
。
Examples
#![feature(option_zip)] #[derive(Debug, PartialEq)] struct Point { x: f64, y: f64, } impl Point { fn new(x: f64, y: f64) -> Self { Self { x, y } } } let x = Some(17.5); let y = Some(42.7); assert_eq!(x.zip_with(y, Point::new), Some(Point { x: 17.5, y: 42.7 })); assert_eq!(x.zip_with(None, Point::new), None);Run
返回包含的 Some
值或默认值
消费 self
参数,如果 Some
,则返回所包含的值,否则,如果 None
,则返回该类型的 default value。
Examples
将字符串转换为整数,将格式不正确的字符串转换为 0 (整数的默认值)。
parse
将字符串转换为实现 FromStr
的任何其他类型,并在错误时返回 None
。
let good_year_from_input = "1909"; let bad_year_from_input = "190blarg"; let good_year = good_year_from_input.parse().ok().unwrap_or_default(); let bad_year = bad_year_from_input.parse().ok().unwrap_or_default(); assert_eq!(1909, good_year); assert_eq!(0, bad_year);Run
将 Result
的 Option
转换为 Option
的 Result
。
None
将被映射到 Ok
(
None
)
。
Some
(
Ok
(_))
Some
(
Err
(_))
将被映射到 Ok
(
Some
(_))
和 Err
(_)
。
Examples
#[derive(Debug, Eq, PartialEq)] struct SomeErr; let x: Result<Option<i32>, SomeErr> = Ok(Some(5)); let y: Option<Result<i32, SomeErr>> = Some(Ok(5)); assert_eq!(x, y.transpose());Run
从 Option<Option<T>>
转换为 Option<T>
Examples
基本用法:
let x: Option<Option<u32>> = Some(Some(6)); assert_eq!(Some(6), x.flatten()); let x: Option<Option<u32>> = Some(None); assert_eq!(None, x.flatten()); let x: Option<Option<u32>> = None; assert_eq!(None, x.flatten());Run
展平一次只能删除一层嵌套:
let x: Option<Option<Option<u32>>> = Some(Some(Some(6))); assert_eq!(Some(Some(6)), x.flatten()); assert_eq!(Some(6), x.flatten().flatten());Run
Trait Implementations
从 &Option<T>
转换为 Option<&T>
。
Examples
将 Option<
String
>
转换为 Option<
usize
>
,并保留原始格式。
map
方法按值取 self
参数,消耗原始值,因此该技术使用 from
首先取 Option
到原始值内部值的引用。
let s: Option<String> = Some(String::from("Hello, Rustaceans!")); let o: Option<usize> = Option::from(&s).map(|ss: &String| ss.len()); println!("Can still print s: {:?}", s); assert_eq!(o, Some(18));Run
接受 Iterator
中的每个元素: 如果为 None
,则不再获取其他元素,并返回 None
。
如果没有发生 None
,则返回包含每个 Option
值的容器。
Examples
这是一个使 vector 中的每个整数递增的示例。
当计算将导致溢出时,我们使用 add
的检查成员返回 None
。
let items = vec![0_u16, 1, 2]; let res: Option<Vec<u16>> = items .iter() .map(|x| x.checked_add(1)) .collect(); assert_eq!(res, Some(vec![1, 2, 3]));Run
如您所见,这将返回预期的有效项。
这是另一个示例,尝试从另一个整数列表中减去一个,这次检查下溢:
let items = vec![2_u16, 1, 0]; let res: Option<Vec<u16>> = items .iter() .map(|x| x.checked_sub(1)) .collect(); assert_eq!(res, None);Run
由于最后一个元素为零,因此会下溢。因此,结果值为 None
。
这是前一个示例的变体,显示在第一个 None
之后不再从 iter
提取其他元素。
let items = vec![3_u16, 2, 1, 10]; let mut shared = 0; let res: Option<Vec<u16>> = items .iter() .map(|x| { shared += x; x.checked_sub(2) }) .collect(); assert_eq!(res, None); assert_eq!(shared, 6);Run
由于第三个元素引起下溢,因此不再使用其他元素,因此 shared
的最终值为 6 (= 3 + 2 + 1
),而不是 16。
type Item = T
type Item = T
被迭代的元素的类型。
在 ?
来决定操作符是应该生成一个值 (因为它返回了 ControlFlow::Continue
),还是将一个值传播回调用者(因为它返回了 ControlFlow::Break
)。 Read more