Вернуть итератор карты, который использует замыкание в Rust [duplicate]
На этот вопрос уже есть ответ здесь:
Как вернуть итератор Filter из функции? 2 ответаЯ изучаю Rust для решения задач Matasano Crypto Challenge и застрял с реализацией шифра Ceasar («однобайтовый xor») в качестве итератора.Моя функция должна выглядеть так:
fn ceaser_cipher_iter(data: &Vec<u8>, key :u8) -> SomeType {
data.iter().map(move |&p| p^key)
}
ЗаменаSomeType
с()
компилятор говорит мне, какого типа он ожидает:core::iter::Map<core::slice::Iter<'_, u8>, [closure src/main.rs:59:21: 59:31]>
, После некоторого удара головой я узнал, что могу использоватьstd::slice::Iter<u8>
заcore::slice::Iter<'_, u8>
, который оставляет закрытие. Насколько я понимаю, мой наивный эксперимент использовать
fn ceaser_cipher_iter(data: &Vec<u8>, key :u8) -> Map<std::slice::Iter<u8>, fn(&u8)->u8 > {
data.iter().map(move |&p| p^key)
}
не может работать, потому что Rust должен знать точный тип замыкания, чтобы выделить память для замыкания (key
должен быть сохранен, будучиmove
г в закрытие). Я пытался следоватьсовет использоватьBox
вместо:
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))
}
Но афаиктmap
не поддерживает это:
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))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Есть ли способ вернуть итератор карты с закрытием?