RustはOption <Vec <u8 >>とOption <&[u8]>を比較します


8

Option<Vec<u8>>と等しいOption<&[u8]>かどうかを比較するエレガントな方法はありますか?(またはのResult代わりにと同等ですOption。)

回答:


10

に変換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
}

Rust 1.40以降では、以下を使用できますas_deref()

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

少し速かったです。OK:)
ケルベロス

@Cerberus私は気にしません、あなたの答えはVec::as_ref私のものではありません、Rustにはスタイルが1つしか存在しないことが証明されました;)
Stargateur

もう一つのオプションはうん&**x
Sven Marnach

11

多分それは最適ではありませんが、このコードはコンパイルされるようです:

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

遊び場

ここには2つの主要な変換があります。

  1. 最初のオプションは所有値、2番目は参照を保持します。したがって、Option<T>(または&Option<T>)からに移動する必要があります。Option<&T>これは、のas_refメソッドを使用して実現されOptionます。

  2. 最初のOptionが成立し&Vec<u8>、それをと比較し&[u8]ます。これはas_refメソッドによって再び処理され、AsRef<[u8]>トレイトで定義され、に実装されVecます。


1
ええと、私は同等にできfirst.map(Vec::as_slice) == secondますか?
-Timmmm、

as_ref()とにかく最初のものが必要です-私はチェックしたところ、それ以外の場合はコンパイルされません。しかし、はい、Vec::as_refVec::as_sliceここで交換可能であるように見えます。
ケルベロス

これは何語?タグを付けます。
alexherm

わかりません、何が問題なのですか?質問にはタグが付けられています(タグ付けされていない場合は、私ではなく質問者に尋ねます)。
ケルベロス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.