До сих пор я не мог придумать что-то без аннотаций, но вы могли бы уменьшить количество аннотаций:
Вы могли бы оставить некоторые дыры, которые должны быть заполнены выводом типа:
pub fn solve_part2(input: &[u32]) -> String {
let color = |pixel: std::iter::StepBy<_>| {
pixel
.skip_while(|l: &&_| **l == 2)
.next()
.map(|c| char::from_digit(*c, 10).unwrap())
.unwrap()
};
let pixel = |n| input.iter().skip(n).step_by(25 * 6);
(0..(25 * 6)).map(|px| color(pixel(px))).collect()
}
В качестве альтернативы, inline color
:
pub fn solve_part3(input: &[u32]) -> String {
let pixel = |n| input.iter().skip(n).step_by(25 * 6);
(0..(25 * 6)).map(|px| pixel(px)
.skip_while(|l| **l == 2)
.next()
.map(|c| char::from_digit(*c, 10).unwrap())
.unwrap()).collect()
}
В качестве альтернативы, сделайте color
локальным fn
:
pub fn solve_part3(input: &[u32]) -> String {
fn color<'a>(pixel: impl Iterator<Item=&'a u32>) -> char {
pixel
.skip_while(|l| **l == 2)
.next()
.map(|c| char::from_digit(*c, 10).unwrap())
.unwrap()
};
let pixel = |n| input.iter().skip(n).step_by(25 * 6);
(0..(25 * 6)).map(|px| color(pixel(px))).collect()
}