【发布时间】:2022-01-28 05:58:37
【问题描述】:
我在 Rust 中有一个 Option,我需要在一个接受切片的函数中使用它。如何从 Option 获取切片,其中 Some(x) 的切片有一个元素,None 的切片有零个元素?
【问题讨论】:
我在 Rust 中有一个 Option,我需要在一个接受切片的函数中使用它。如何从 Option 获取切片,其中 Some(x) 的切片有一个元素,None 的切片有零个元素?
【问题讨论】:
这将生成Option 的不可变切片:
the_option.as_ref()
.map(core::slice::from_ref)
.unwrap_or_default()
这将生成Option 的可变切片:
the_mutable_option.as_mut()
.map(core::slice::from_mut)
.unwrap_or_default()
这些首先使用Option 的as_ref 或as_mut 方法生成第二个Option,其中包含对仍在原始Option 中的值的引用。
然后,他们使用Option 的map 方法,如果第二个Option 是Some 值,则将core::slice::from_ref 或core::slice::from_mut 应用于Some 值内的引用,将其更改为单元素切片。
然后,它使用Option 的unwrap_or_default 方法消耗第二个Option。如果它是Some 值,则生成上一步中的单元素切片。否则,如果它是 None 值,则生成默认切片 which is an empty slice。
【讨论】:
.map_or_else() 可以替换为.map(core::slice::from{ref|mut}).unwrap_or_default()。
可以使用opt_slice和opt_slice_mut这两个函数,由crate提供ref_slice
pub fn opt_slice<A>(opt: &Option<A>) -> &[A]
pub fn opt_slice_mut<A>(opt: &mut Option<A>) -> &mut [A]
【讨论】:
Option支持IntoIterator,所以
let v = opt.into_iter().collect::<Vec<_>>()
为您提供一个包含 0 或 1 个元素的 Vec,可以将其传递给您的函数,因为 Vec<T> 实现了 Deref<T>。
【讨论】: