Gibt es eine elegante Möglichkeit, die Option<Vec<u8>>
Gleichheit mit zu vergleichen Option<&[u8]>
? (Oder gleichwertig mit Result
statt Option
.)
8
Sie müssen nur konvertieren Option<Vec<u8>>
zu Option<&[u8]>
verwenden as_ref()
und Index
Eigenschaft:
fn foo(a: Option<Vec<u8>>, b: Option<&[u8]>) -> bool {
a.as_ref().map(|x| &x[..]) == b
}
Ab Rust 1.40 können Sie Folgendes verwenden as_deref()
:
fn foo(a: Option<Vec<u8>>, b: Option<&[u8]>) -> bool {
a.as_deref() == b
}
Vec::as_ref
meine nicht, erneut bewiesen, dass es nicht nur einen Stil in Rust gibt;)&**x
.Vielleicht ist es nicht optimal, aber dieser Code scheint zu kompilieren:
Spielplatz
Hier gibt es zwei Schlüsseltransformationen:
Die erste Option enthält den eigenen Wert, die zweite eine Referenz. Wir sollten also von
Option<T>
(oder&Option<T>
) nach gehenOption<&T>
, und dies wird mit deras_ref
Methode von erreichtOption
.Das erste gilt
Option
jetzt&Vec<u8>
und wir werden es mit vergleichen&[u8]
. Dies wird erneut von deras_ref
Methode behandelt, die jetzt imAsRef<[u8]>
Merkmal definiert und am implementiert istVec
.quelle
first.map(Vec::as_slice) == second
?as_ref()
sowieso brauchen - ich habe es gerade überprüft, es wird sonst nicht kompiliert. Aber ja,Vec::as_ref
undVec::as_slice
scheinen hier austauschbar zu sein.