Вернуть итератор карты, который использует замыкание в 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))
                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Есть ли способ вернуть итератор карты с закрытием?

Ответы на вопрос(1)

Ваш ответ на вопрос