如何使用 ?并抓住鲁斯特?

Ana*_*Ana 0 exception-handling try-catch rust

看来,?和catch已被接受为锈,但我不能够正确地使用它:

let x = catch {
    1
}
Run Code Online (Sandbox Code Playgroud)

我想这应该给我Ok(1).相反,我得到错误:

error: expected identifier, found `1`
  --> src/main.rs:15:9
   |
15 |         1
   |         ^
Run Code Online (Sandbox Code Playgroud)

Rust中还没有支持这种语法,还是我的代码有问题?

Mat*_* M. 5

TL; DR:RFC已被接受,但您的语法略有偏差(不幸的是)并且该功能仍然是门控的.

请参阅Alec关于如何实际使用的优秀答案catch.


我鼓励您阅读完整的错误日志:

error: expected identifier, found `1`
 --> <anon>:2:21
  |
2 |     let x = catch { 1 };
  |                     ^

error[E0422]: cannot find struct, variant or union type `catch` in this scope
 --> <anon>:2:13
  |
2 |     let x = catch { 1 };
  |             ^^^^^ not found in this scope

error: aborting due to 2 previous errors
Run Code Online (Sandbox Code Playgroud)

线索在第二条错误消息中:

catch在此范围内找不到struct,variant或union类型

这真的让我们知道catch编译器没有将其识别为关键字.

由于catch看起来像任何常规单词,所发生的是编译器尝试将其解析为构建struct或enum.实际上,构建struct或的语法enum是:

struct X { name: i32 }

let x = X { name: 1 };
Run Code Online (Sandbox Code Playgroud)

因此,编译器会看到<identifier> {并期望它后跟一个列表<identifier>: <expression>.它读取1(不是标识符)并报告不是标识符的错误1.


Ale*_*lec 5

这听起来很愚蠢,因为它有点儿.你需要拥有

#![feature(catch_expr)]

fn main() {
    let x = do catch {
        1
    };
}
Run Code Online (Sandbox Code Playgroud)

基本上,catch一样default并且union,不能进行关键字而不破坏向后兼容性.由于Rust已经尝试保证1.x上的任何代码仍然可以在1.y上运行,因此引入default,union现在catch进入语法一直都是要弄清楚冲突.对于union和default,没有 - 在这些职位中从不期望标识符.

对于catch,catch { 1 }也可以解释为struct literal.除非您需要do(保留关键字)之前发生catch- 否则没有歧义.是的,这很难看,每个人都知道.

希望这些噩梦在2.0出现时消失,我们可以打破向后兼容性.引用围绕语法问题catch的rust-internals讨论:

我们最终希望以这种方式重新调整其他语法的列表越来越多,但我们通常会避免破坏在1.y上运行1.x的代码的能力,其中y> x,除非代码正在利用a编译器错误或只是一个非常罕见的结构.我们的稳定性保证了我们要求大多数人等到2.0.

  • @Shepmaster我希望你错了.:) TBH,对于很多这些变化,实际上非常少的代码实际上破了 - 问题是可以想象_could_ break的代码.从长远来看,将`union`作为关键字可能是一个非常好的主意 - 但它应该是一个非常缓慢的过程.首先是警告"`union`将成为一个关键字,不要将它用作变量",然后一个错误你可以用一个标志禁用,然后最后一个硬错误.否则,Rust的语法将与C++的语法相同. (8认同)
  • *当2.0出现时* - 没有针对Rust 2.0的计划,有人甚至可能会说*反计划* - 由于不愿意在Rust的许多领域升级而没有人兴奋打破向后兼容性目标. (6认同)
  • 自从之前的评论发表以来,已经发生了介绍Rust"2018 Edition"的工作,并且新的关键字又回到了桌面上! (2认同)