虽然让链导致生 rust 分析仪抱怨的功能是不稳定的生 rust 1.66,这不是刚刚合并到稳定最近?

eqfvzcg8  于 2023-01-02  发布在  其他
关注(0)|答案(2)|浏览(138)
while let Some(peek_ch) = chars.peek() && peek_ch.is_whitespace() {
      chars.next();
    }

以上代码是引起生 rust 的投诉

`let` expressions in this position are unstable
see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information

我的理解是if-let和while-let链接是稳定的?而且,从这个错误和github问题来看,我不能确定启用什么不稳定特性来允许这种情况,你通常是如何确定的?

lqfhib0f

lqfhib0f1#

问题是你还不被允许使用&&while let,因为不幸的是稳定had to be reverted的合并
如果你使用的是夜间编译器,它会告诉你需要启用什么特性才能使它工作:

> cargo +nightly run
...
error[E0658]: `let` expressions in this position are unstable
 --> src/main.rs:4:11
  |
4 |     while let Some(peek_ch) = chars.peek() && peek_ch.is_whitespace() {
  |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information
  = help: add `#![feature(let_chains)]` to the crate attributes to enable

这对夜间铁 rust 有效:

#![feature(let_chains)]
fn main() {
    let mut chars = "hello".chars().peekable();
    while let Some(peek_ch) = chars.peek() && peek_ch.is_whitespace() {
        chars.next();
    }
}

Playground link
或者,您可以使用PeterHalls的一个稳定解决方案来解决它。

tjvv9vkg

tjvv9vkg2#

问题出在&&上,而不是while let。正如所写的,您试图匹配表达式chars.peek() && peek_ch.is_whitespace()的结果,但这没有意义,因为peek返回Option<T>,而is_whitespace返回bool
错误消息有点误导,因为它认为您正在尝试使用if letchains,这是一个不稳定的特性,允许您在多个模式上进行匹配。
您可以将其重写为:

while let Some(peek_ch) = chars.peek() {
    if peek_ch.is_whitespace() {
        chars.next();
    } else {
        break;
    }
}

或者

while let Some(peek_ch) = chars.peek().filter(|c| c.is_whitespace()) {
    chars.next();
}

相关问题