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.