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

Timmmm
quelle

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
}
Stargateur
quelle
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.

Cerberus
quelle
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