Return ein Map-Iterator, der eine Schließung in Rust verwendet [duplizieren]

Diese Frage hat hier bereits eine Antwort:

Wie kann ich einen Filter-Iterator von einer Funktion zurückgeben? 2 Antworten

Ich lerne etwas über das Lösen der Matasano-Crypto-Herausforderungen durch Rust und bin mit der Implementierung der Ceasar-Chiffre ("Single-Byte-XOR") als Iterator festgefahren.Meine Funktion soll so aussehen:

fn ceaser_cipher_iter(data: &Vec<u8>, key :u8) -> SomeType {
    data.iter().map(move |&p| p^key)
}

ReplacingSomeType mit(), der Compiler sagt mir, welchen Typ er erwartet:core::iter::Map<core::slice::Iter<'_, u8>, [closure src/main.rs:59:21: 59:31]>. Nach einigem Headbangen fand ich heraus, dass ich @ benutzen könnstd::slice::Iter<u8> zumcore::slice::Iter<'_, u8>, das den Verschluss verlässt. Meines Wissens nach ist mein naives Experiment @ zu benutz

fn ceaser_cipher_iter(data: &Vec<u8>, key :u8) -> Map<std::slice::Iter<u8>, fn(&u8)->u8 > {
    data.iter().map(move |&p| p^key)
}

kann nicht funktionieren, da Rust den genauen Schließungstyp kennen muss, um den Speicher für die Schließung zuzuweisen key muss gespeichert werden, indem man @ imoved in den Verschluss). Ich habe versucht, @ zu folgder Ratschla um ein @ zu benutzBox stattdessen

fn ceaser_cipher_iter(data: &Vec<u8>, key :u8) -> Map<std::slice::Iter<u8>, Box<Fn(&u8)->u8> > {
    data.iter().map(Box::new(move |&p| p^key))
}

Aber afaictmap unterstützt es nicht:

src/main.rs:59:17: 59:47 error: the trait `core::ops::FnMut<(&u8,)>` is not implemented for the type `Box<for<'r> core::ops::Fn(&'r u8) -> u8>` [E0277]
src/main.rs:59     data.iter().map(Box::new(move |&p| p^key))
                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/main.rs:59:17: 59:47 error: the trait `core::ops::FnOnce<(&u8,)>` is not implemented for the type `Box<for<'r> core::ops::Fn(&'r u8) -> u8>` [E0277]
src/main.rs:59     data.iter().map(Box::new(move |&p| p^key))
                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Gibt es eine Möglichkeit, einen Karteniterator mit einem Abschluss zurückzugeben?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage