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 AntwortenIch 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 @ imove
d 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?