是否有一种优雅的方法将Option<Vec<u8>>
与Option<&[u8]>
的相等性进行比较? (或等效地用Result
代替Option
。)
答案 0 :(得分:11)
也许不是最理想的,但是这段代码似乎可以编译:
fn cmp(first: Option<Vec<u8>>, second: Option<&[u8]>) -> bool {
first.as_ref().map(Vec::as_ref) == second
}
这里有两个主要转换:
第一个选项保留拥有的值,第二个选项保留引用。因此,我们应该从Option<T>
(或&Option<T>
)转到Option<&T>
,这可以通过Option
的{{3}}方法来实现。
第一个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
}