Различные типы string.chars() для .next() и .peek()

Я пытаюсь использовать 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.

Есть ли чистый способ, чтобы оба возвращаемых значения имели один и тот же тип?

Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
1
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть два варианта снятие защиты (&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). Спасибо!

George Shuklin 02.04.2022 20:15

Другие вопросы по теме