Antworten:
Sie müssen nur konvertieren Option<Vec<u8>>zu Option<&[u8]>verwenden as_ref()und IndexEigenschaft:
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_refmeine nicht, erneut bewiesen, dass es nicht nur einen Stil in Rust gibt;)
&**x.
Vielleicht ist es nicht optimal, aber dieser Code scheint zu kompilieren:
fn cmp(first: Option<Vec<u8>>, second: Option<&[u8]>) -> bool {
first.as_ref().map(Vec::as_ref) == second
}
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 gehen Option<&T>, und dies wird mit der as_refMethode von erreicht Option.
Das erste gilt Optionjetzt &Vec<u8>und wir werden es mit vergleichen &[u8]. Dies wird erneut von der as_refMethode behandelt, die jetzt im AsRef<[u8]>Merkmal definiert und am implementiert ist Vec.
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_refund Vec::as_slicescheinen hier austauschbar zu sein.