锈比较选项<Vec <u8 >>与选项<&[u8]>

时间:2019-10-14 10:12:16

标签: rust

是否有一种优雅的方法将Option<Vec<u8>>Option<&[u8]>的相等性进行比较? (或等效地用Result代替Option。)

2 个答案:

答案 0 :(得分:11)

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

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

Playground

这里有两个主要转换:

  1. 第一个选项保留拥有的值,第二个选项保留引用。因此,我们应该从Option<T>(或&Option<T>)转到Option<&T>,这可以通过Option的{​​{3}}方法来实现。

  2. 第一个Option现在保存着&Vec<u8>,我们将其与&[u8]进行比较。再次由as_ref方法处理,该方法现在定义在AsRef<[u8]>特征上,并在Vec上实现。

答案 1 :(得分:10)

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

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

从Rust 1.40开始,您可以使用as_deref()

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