Rust将Option <Vec <u8 >>与Option <&[u8]>进行比较

Tim*_*mmm 7 rust

有没有一种比较Option<Vec<u8>>平等的优雅方法Option<&[u8]>?(或等效于Result而不是Option。)

Cer*_*rus 11

也许它不是最理想的,但是这段代码似乎可以编译:

fn cmp(first: Option<Vec<u8>>, second: Option<&[u8]>) -> bool {
    first.as_ref().map(Vec::as_ref) == second
}
Run Code Online (Sandbox Code Playgroud)

操场

这里有两个关键的转换:

  1. 第一个期权持有拥有的价值,第二个期权持有参考价值。因此,我们应该从Option<T>(或&Option<T>)转到Option<&T>,这是使用的as_ref方法实现的Option

  2. 现在第一个Option成立&Vec<u8>,我们将与之比较&[u8]as_ref现在由AsRef<[u8]>trait 定义并在上实现的方法再次对此进行处理Vec


Sta*_*eur 9

您只需要使用和特质转换Option<Vec<u8>>Option<&[u8]>as_ref()Index

fn foo(a: Option<Vec<u8>>, b: Option<&[u8]>) -> bool {
    a.as_ref().map(|x| &x[..]) == b
}
Run Code Online (Sandbox Code Playgroud)

将来您可以使用as_deref()

fn foo(a: Option<Vec<u8>>, b: Option<&[u8]>) -> bool {
    a.as_deref() == b
}
Run Code Online (Sandbox Code Playgroud)