Я пытаюсь использовать string.chars().peekable(), и проблема в том, что у меня разные типы .next() и .peek(). Один Option<char>, второй Option<&char>, и мне трудно их сравнивать.
Мой код (s есть String):
let mut left_iter = s.chars().peekable();
let mut right_iter = s.chars().rev().peekable();
loop {
let left = left_iter.next();
let right = right_iter.next();
let left_next = left_iter.peek();
let left_right = right_iter.peek();
if left == right || left == right_next {
...
}
Ошибка, которую я получаю, очевидна:
ожидал &char, нашел char
Но я не могу найти способ, чтобы и next(), и peek() имели один и тот же тип без повторной/деконструкции Option.
Есть ли чистый способ, чтобы оба возвращаемых значения имели один и тот же тип?

У вас есть два варианта снятие защиты (&T -> T) один или ссылка (T -> &T) другой:
Поскольку они завернуты в Option, вы можете zip их и оперировать с картой, сопоставлением с образцом или разыменованием ссылки, в противном случае вернуть false.:
fn main() {
let left = Some('c');
let right = Some(&'c');
println!("{}", right.zip(left).map(|(&r, l)| r == l).unwrap_or(false));
}
Или, поскольку char это Copy, вы можете использовать Option::copied:
fn main() {
let left = Some('c');
let right = Some(&'c');
println!("{}", left == right.copied());
}
Кроме того, и, возможно, проще, вы можете использовать as_ref, чтобы получить Option<&T> из Option<T>:
fn main() {
let left = Some('c');
let right = Some(&'c');
println!("{}", left.as_ref() == right);
}
Я люблю .copied. Звучит наиболее универсально (для char case). Спасибо!
Связано: Какой самый идиоматический способ проверить два параметра на равенство, когда они содержат значения, которые можно проверить на равенство?.