Rust vergleiche Option <Vec <u8>> mit Option <& [u8]>


8

Gibt es eine elegante Möglichkeit, die Option<Vec<u8>>Gleichheit mit zu vergleichen Option<&[u8]>? (Oder gleichwertig mit Resultstatt Option.)

Antworten:


10

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
}

Du warst nur ein bisschen schneller, ok :)
Cerberus

@Cerberus Ich habe nichts dagegen, Ihre Antwort verwenden Sie Vec::as_refmeine nicht, erneut bewiesen, dass es nicht nur einen Stil in Rust gibt;)
Stargateur

Ja, eine andere Option wäre &**x.
Sven Marnach

11

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
}

Spielplatz

Hier gibt es zwei Schlüsseltransformationen:

  1. 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.

  2. 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.


1
Ah, könnte ich das auch tun first.map(Vec::as_slice) == second?
Timmmm

Sie werden das erste 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.
Cerberus

Welche Sprache ist das? Kennzeichnen Sie es.
Alexander

Ich verstehe nicht, was ist los? Die Frage ist markiert (und wenn nicht, würden Sie den Fragesteller fragen, nicht mich).
Cerberus
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.