Enum std::option::Option1.0.0[][src]

pub enum Option<T> {
    None,
    Some(T),
}
Expand description

Option 类型。有关更多信息,请参见 模块级文档

Variants

None

没有值

Some(T)

一些值 T

Implementations

如果选项是 Some 值,则返回 true

Examples

let x: Option<u32> = Some(2);
assert_eq!(x.is_some(), true);

let x: Option<u32> = None;
assert_eq!(x.is_some(), false);
Run

如果选项是 None 值,则返回 true

Examples

let x: Option<u32> = Some(2);
assert_eq!(x.is_none(), false);

let x: Option<u32> = None;
assert_eq!(x.is_none(), true);
Run
🔬 This is a nightly-only experimental API. (option_result_contains #62358)

如果选项是包含给定值的 Some 值,则返回 true

Examples

#![feature(option_result_contains)]

let x: Option<u32> = Some(2);
assert_eq!(x.contains(&2), true);

let x: Option<u32> = Some(3);
assert_eq!(x.contains(&2), false);

let x: Option<u32> = None;
assert_eq!(x.contains(&2), false);
Run

&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

&mut Option<T> 转换为 Option<&mut T>

Examples

let mut x = Some(2);
match x.as_mut() {
    Some(v) => *v = 42,
    None => {},
}
assert_eq!(x, Some(42));
Run

Pin<&Option<T>> 转换为 Option<Pin<&T>>

Pin<&mut Option<T>> 转换为 Option <Pin<&mut T>>

返回包含 self 值的包含的 Some 值。

Panics

Panics (如果值是具有 msg 提供的自定义 panic 消息的 None)。

Examples

let x = Some("value");
assert_eq!(x.expect("fruits are healthy"), "value");
Run
let x: Option<&str> = None;
x.expect("fruits are healthy"); // `fruits are healthy` 的 panics
Run

返回包含 self 值的包含的 Some 值。

由于此函数可能为 panic,因此通常不建议使用该函数。 相反,更喜欢使用模式匹配并显式处理 None 大小写,或者调用 unwrap_orunwrap_or_elseunwrap_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"); // fails
Run

返回包含的 Some 值或提供的默认值。

急切地评估传递给 unwrap_or 的参数; 如果要传递函数调用的结果,建议使用 unwrap_or_else,它是惰性求值的。

Examples

assert_eq!(Some("car").unwrap_or("bike"), "car");
assert_eq!(None.unwrap_or("bike"), "bike");
Run

返回包含的 Some 值或从闭包中计算得出。

Examples

let k = 10;
assert_eq!(Some(4).unwrap_or_else(|| 2 * k), 4);
assert_eq!(None.unwrap_or_else(|| 2 * k), 20);
Run
🔬 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

计算 default 函数的结果 (如果没有),或将不同的函数应用于包含的值 (如果有)。

Examples

let k = 21;

let x = Some("foo");
assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 3);

let x: Option<&str> = None;
assert_eq!(x.map_or_else(|| 2 * k, |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

返回可能包含的值的迭代器。

Examples

let x = Some(4);
assert_eq!(x.iter().next(), Some(&4));

let x: Option<u32> = None;
assert_eq!(x.iter().next(), None);
Run

返回可能包含的值的可变迭代器。

Examples

let mut x = Some(4);
match x.iter_mut().next() {
    Some(v) => *v = 42,
    None => {},
}
assert_eq!(x, Some(42));

let mut x: Option<u32> = None;
assert_eq!(x.iter_mut().next(), None);
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 并返回:

  • Some(t) 如果 predicate 返回 true (其中 t 是包装的值),并且
  • None 如果 predicate 返回 false

该函数的工作方式类似于 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

如果 selfoptb 之一恰好是 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
🔬 This is a nightly-only experimental API. (option_get_or_insert_default #82901)

如果默认值为 None,则将其插入选项中,然后将所包含的值返回变量引用。

Examples

#![feature(option_get_or_insert_default)]

let mut x = None;

{
    let y: &mut u32 = x.get_or_insert_default();
    assert_eq!(y, &0);

    *y = 7;
}

assert_eq!(x, Some(7));
Run

如果从 f 计算得出的值是 None,则将其插入选项中,然后将所包含的值返回可变引用。

Examples

let mut x = None;

{
    let y: &mut u32 = x.get_or_insert_with(|| 5);
    assert_eq!(y, &5);

    *y = 7;
}

assert_eq!(x, Some(7));
Run

从选项中取出值,将 None 留在其位置。

Examples

let mut x = Some(2);
let y = x.take();
assert_eq!(x, None);
assert_eq!(y, Some(2));

let mut x: Option<u32> = None;
let y = x.take();
assert_eq!(x, None);
assert_eq!(y, None);
Run

用参数中给定的值替换选项中的实际值,如果存在则返回旧值,将 Some 保留在其位置,而不用对其中一个进行初始化。

Examples

let mut x = Some(2);
let old = x.replace(5);
assert_eq!(x, Some(5));
assert_eq!(old, Some(2));

let mut x = None;
let old = x.replace(3);
assert_eq!(x, Some(3));
assert_eq!(old, None);
Run

用另一个 Option 压缩 self

如果 selfSome(s),而 otherSome(o),则此方法返回 Some((s, o))。 否则,返回 None

Examples

let x = Some(1);
let y = Some("hi");
let z = None::<u8>;

assert_eq!(x.zip(y), Some((1, "hi")));
assert_eq!(x.zip(z), None);
Run
🔬 This is a nightly-only experimental API. (option_zip #70086)

使用函数 f 压缩 self 和另一个 Option

如果 selfSome(s),而 otherSome(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

通过复制选项的内容将 Option<&T> 的 Maps 转换为 Option<T>

Examples

let x = 12;
let opt_x = Some(&x);
assert_eq!(opt_x, Some(&12));
let copied = opt_x.copied();
assert_eq!(copied, Some(12));
Run

通过复制选项的内容将 Option<&mut T> 的 Maps 转换为 Option<T>

Examples

let mut x = 12;
let opt_x = Some(&mut x);
assert_eq!(opt_x, Some(&mut 12));
let copied = opt_x.copied();
assert_eq!(copied, Some(12));
Run

通过克隆选项的内容将 Option<&T> Maps 转换为 Option<T>

Examples

let x = 12;
let opt_x = Some(&x);
assert_eq!(opt_x, Some(&12));
let cloned = opt_x.cloned();
assert_eq!(cloned, Some(12));
Run

通过克隆选项的内容将 Option<&mut T> Maps 转换为 Option<T>

Examples

let mut x = 12;
let opt_x = Some(&mut x);
assert_eq!(opt_x, Some(&mut 12));
let cloned = opt_x.cloned();
assert_eq!(cloned, Some(12));
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

Option<T> (或 &Option<T>) 转换为 Option<&T::Target>

将原始 Option 保留在原位,创建一个带有对原始 Option 的引用的新 Option,并通过 Deref 强制执行其内容。

Examples

let x: Option<String> = Some("hey".to_owned());
assert_eq!(x.as_deref(), Some("hey"));

let x: Option<String> = None;
assert_eq!(x.as_deref(), None);
Run

Option<T> (或 &mut Option<T>) 转换为 Option<&mut T::Target>

将原始 Option 保留在原位,创建一个新的 Option,其中包含对内部类型的 Deref::Target 类型的引用。

Examples

let mut x: Option<String> = Some("hey".to_owned());
assert_eq!(x.as_deref_mut().map(|x| {
    x.make_ascii_uppercase();
    x
}), Some("HEY".to_owned().as_mut_str()));
Run

ResultOption 转换为 OptionResult

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

返回值的副本。 Read more

source 执行复制分配。 Read more

使用给定的格式化程序格式化该值。 Read more

返回 None

Examples

let opt: Option<u32> = Option::default();
assert!(opt.is_none());
Run

&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

&mut Option<T> 转换为 Option<&mut T>

Examples

let mut s = Some(String::from("Hello"));
let o: Option<&mut String> = Option::from(&mut s);

match o {
    Some(t) => *t = String::from("Hello, Rustaceans!"),
    None => (),
}

assert_eq!(s, Some(String::from("Hello, Rustaceans!")));
Run

val 复制到新的 Some 中。

Examples

let o: Option<u8> = Option::from(67);

assert_eq!(Some(67), o);
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。

🔬 This is a nightly-only experimental API. (try_trait_v2 #84277)

从兼容的 Residual 类型构造类型。 Read more

将该值输入给定的 HasherRead more

将这种类型的切片送入给定的 Hasher 中。 Read more

返回可能包含的值上的消耗迭代器。

Examples

let x = Some("string");
let v: Vec<&str> = x.into_iter().collect();
assert_eq!(v, ["string"]);

let x = None;
let v: Vec<&str> = x.into_iter().collect();
assert!(v.is_empty());
Run

被迭代的元素的类型。

我们将其变成哪种迭代器?

被迭代的元素的类型。

我们将其变成哪种迭代器?

从一个值创建一个迭代器。 Read more

被迭代的元素的类型。

我们将其变成哪种迭代器?

从一个值创建一个迭代器。 Read more

此方法返回 selfother 之间的 OrderingRead more

比较并返回两个值中的最大值。 Read more

比较并返回两个值中的最小值。 Read more

将值限制为一定的时间间隔。 Read more

此方法测试 selfother 值是否相等,并由 == 使用。 Read more

此方法测试 !=

如果存在,则此方法返回 selfother 值之间的顺序。 Read more

此方法测试的内容少于 (对于 selfother),并且由 < 操作员使用。 Read more

此方法测试小于或等于 (对于 selfother),并且由 <= 运算符使用。 Read more

此方法测试大于 (对于 selfother),并且由 > 操作员使用。 Read more

此方法测试是否大于或等于 (对于 selfother),并且由 >= 运算符使用。 Read more

接受 Iterator 中的每个元素: 如果它是 None,则不再获取其他元素,并返回 None。 如果没有发生 None,则返回所有元素的乘积。

接受 Iterator 中的每个元素: 如果它是 None,则不再获取其他元素,并返回 None。 如果没有发生 None,则返回所有元素的总和。

Examples

这总结了字符 ‘a’ 在字符串 vector 中的位置,如果单词没有字符 ‘a’,则该操作返回 None:

let words = vec!["have", "a", "great", "day"];
let total: Option<usize> = words.iter().map(|w| w.find('a')).sum();
assert_eq!(total, Some(5));
Run
🔬 This is a nightly-only experimental API. (try_trait_v2 #84277)

当不短路时,? 产生的值的类型。

🔬 This is a nightly-only experimental API. (try_trait_v2 #84277)

短路时作为 ? 的一部分传递给 FromResidual::from_residual 的值的类型。 Read more

🔬 This is a nightly-only experimental API. (try_trait_v2 #84277)

从它的 Output 类型构造类型。 Read more

🔬 This is a nightly-only experimental API. (try_trait_v2 #84277)

? 来决定操作符是应该生成一个值 (因为它返回了 ControlFlow::Continue),还是将一个值传播回调用者(因为它返回了 ControlFlow::Break)。 Read more

Auto Trait Implementations

Blanket Implementations

获取 selfTypeIdRead more

从拥有的值中一成不变地借用。 Read more

从拥有的值中借用。 Read more

执行转换。

执行转换。

执行转换。

获得所有权后的结果类型。

通常通过克隆从借用数据中创建拥有的数据。 Read more

🔬 This is a nightly-only experimental API. (toowned_clone_into #41263)

recently added

使用借来的数据来替换拥有的数据,通常是通过克隆。 Read more

发生转换错误时返回的类型。

执行转换。

发生转换错误时返回的类型。

执行转换。