在Rust中将Option&lt;&amp;[u8]&gt;转换为Option&lt;Vec< u8>&gt;?

blmhpbnm  于 2023-05-29  发布在  其他
关注(0)|答案(3)|浏览(148)

如何将Option<&[u8]>转换为Option<Vec<u8>>

ehxuflar

ehxuflar1#

fn main() {
    let a: Option<&[u8]> = Some(&[1, 2, 3]);
    let b: Option<Vec<u8>> = a.map(Vec::from);
    println!("{:?}", b);
}
Some([1, 2, 3])

甚至是这个:

fn main() {
    let a: Option<&[u8]> = Some(&[1, 2, 3]);
    let b: Option<Vec<u8>> = a.map(Into::into);
    println!("{:?}", b);
}
Some([1, 2, 3])
daolsyd0

daolsyd02#

我认为o.map(ToOwned::to_owned)最好地表达了意图:得到一个没有拥有的东西的拥有版本。

goqiplq2

goqiplq23#

一个可能的解决方案是使用Option.map()和闭包(lambda函数)。

let maybe_slice = Option<&[u8]>;

let maybe_vec = maybe_slice.map(
    |slice| {
        return Vec::from(slice);
    }
);

然而,这会导致一组稍微笨拙的行,以可读的方式格式化闭包。
顺便说一句,如果你想知道为什么变量被称为maybe_slicemaybe_vec,这是为了明确变量的类型是Option<T>。无论您在哪里看到前缀maybe_,您都立即知道您正在处理一个可选的。
对于Result类型,我已经开始使用result_作为前缀,但我个人并不喜欢这样。maybe_也可以用于Result类型,但是optional_或其他类型必须用于Option类型。

相关问题