【问题标题】:How can I get a slice from an Option in Rust?如何从 Rust 中的选项中获取切片?
【发布时间】:2022-01-28 05:58:37
【问题描述】:

我在 Rust 中有一个 Option,我需要在一个接受切片的函数中使用它。如何从 Option 获取切片,其中 Some(x) 的切片有一个元素,None 的切片有零个元素?

【问题讨论】:

    标签: rust slice


    【解决方案1】:

    这将生成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()
    

    这些首先使用Optionas_refas_mut 方法生成第二个Option,其中包含对仍在原始Option 中的值的引用。

    然后,他们使用Optionmap 方法,如果第二个OptionSome 值,则将core::slice::from_refcore::slice::from_mut 应用于Some 值内的引用,将其更改为单元素切片。

    然后,它使用Optionunwrap_or_default 方法消耗第二个Option。如果它是Some 值,则生成上一步中的单元素切片。否则,如果它是 None 值,则生成默认切片 which is an empty slice

    【讨论】:

    • .map_or_else() 可以替换为.map(core::slice::from{ref|mut}).unwrap_or_default()
    【解决方案2】:

    可以使用opt_sliceopt_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]
    

    【讨论】:

      【解决方案3】:

      Option支持IntoIterator,所以

      let v = opt.into_iter().collect::<Vec<_>>()
      

      为您提供一个包含 0 或 1 个元素的 Vec,可以将其传递给您的函数,因为 Vec&lt;T&gt; 实现了 Deref&lt;T&gt;

      【讨论】:

        猜你喜欢
        • 2014-10-15
        • 2018-01-29
        • 1970-01-01
        • 2021-03-29
        • 1970-01-01
        • 1970-01-01
        • 2020-08-15
        • 2016-08-30
        • 1970-01-01
        相关资源
        最近更新 更多