不同类型的 string.chars(),用于 .next() 和 .peek()

Different types of string.chars(), for .next() and .peek()

我正在尝试使用 string.chars().peekable(),但我遇到的问题是我的类型与 .next().peek() 不同。一个是Option<char>,第二个是Option<&char>,比较麻烦

我的代码是(sString):

    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() 具有相同的类型而没有 re/deconstructing 选项。

有没有一种干净的方法可以让两个 return 值具有相同的类型?

你有两个选择 取消引用 (&T -> T) 一个或 引用 (T -> &T) 其他:

取消引用

由于它们被包装在 Option 中,您可以 zip 它们并使用映射、模式匹配或取消引用引用的对象进行操作,否则 return false。 :

fn main() {
    let left = Some('c');
    let right = Some(&'c');
    println!("{}", right.zip(left).map(|(&r, l)| r == l).unwrap_or(false));
}

Playground

或者由于 charCopy,您可以使用 Option::copied:

fn main() {
    let left = Some('c');
    let right = Some(&'c');
    println!("{}", left == right.copied());
}

引用

此外,也许更简单,您可以使用 as_refOption<T>:

获取 Option<&T>
fn main() {
    let left = Some('c');
    let right = Some(&'c');
    println!("{}", left.as_ref() == right);
}

Playground