如何将Option<&[u8]>转换为Option<Vec<u8>>?
Option<&[u8]>
Option<Vec<u8>>
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); }
daolsyd02#
我认为o.map(ToOwned::to_owned)最好地表达了意图:得到一个没有拥有的东西的拥有版本。
o.map(ToOwned::to_owned)
goqiplq23#
一个可能的解决方案是使用Option.map()和闭包(lambda函数)。
Option.map()
let maybe_slice = Option<&[u8]>; let maybe_vec = maybe_slice.map( |slice| { return Vec::from(slice); } );
然而,这会导致一组稍微笨拙的行,以可读的方式格式化闭包。顺便说一句,如果你想知道为什么变量被称为maybe_slice和maybe_vec,这是为了明确变量的类型是Option<T>。无论您在哪里看到前缀maybe_,您都立即知道您正在处理一个可选的。对于Result类型,我已经开始使用result_作为前缀,但我个人并不喜欢这样。maybe_也可以用于Result类型,但是optional_或其他类型必须用于Option类型。
maybe_slice
maybe_vec
Option<T>
maybe_
Result
result_
optional_
Option
3条答案
按热度按时间ehxuflar1#
甚至是这个:
daolsyd02#
我认为
o.map(ToOwned::to_owned)
最好地表达了意图:得到一个没有拥有的东西的拥有版本。goqiplq23#
一个可能的解决方案是使用
Option.map()
和闭包(lambda函数)。然而,这会导致一组稍微笨拙的行,以可读的方式格式化闭包。
顺便说一句,如果你想知道为什么变量被称为
maybe_slice
和maybe_vec
,这是为了明确变量的类型是Option<T>
。无论您在哪里看到前缀maybe_
,您都立即知道您正在处理一个可选的。对于
Result
类型,我已经开始使用result_
作为前缀,但我个人并不喜欢这样。maybe_
也可以用于Result
类型,但是optional_
或其他类型必须用于Option
类型。