Rust中如何比较Option<Vec<u8>>和Option<&[u8]>?

9
有没有一种优雅的方式来比较 Option<Vec<u8>>Option<&[u8]> 的相等性?(或等价地,用 Result 替换 Option。)
2个回答

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

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

Playground

这里有两个关键的转换:

  1. 第一个Option持有拥有所有权的值,第二个持有引用。因此,我们需要从Option<T>(或&Option<T>)转换为Option<&T>,并且可以使用Optionas_ref方法来实现。

  2. 第一个Option现在持有&Vec<u8>,我们将把它与&[u8]进行比较。这再次通过AsRef<[u8]>特征定义的as_ref方法处理,并在Vec上实现。


1
那么我可以等价地这样做吗:first.map(Vec::as_slice) == second - Timmmm
你无论如何都需要第一个 as_ref() - 我刚刚检查了,否则它将无法编译。但是,Vec::as_refVec::as_slice 在这里似乎是可以互换的。 - Cerberus
这是什么编程语言?给它打上标签。 - alexherm
我不明白,出了什么问题?这个问题已经被标记了(如果没有标记,你应该问提问者而不是我)。 - Cerberus

11

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

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
}

你刚才快了一点,好的 :) - Cerberus
@Cerberus 我不介意,你的答案使用了 Vec::as_ref,而我的没有,再次证明 Rust 中并不存在一种风格。;) - Stargateur
另一个选项是&**x - Sven Marnach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接