【发布时间】:2020-10-05 21:05:38
【问题描述】:
我在函数末尾有一个相当复杂的match 语句(带有嵌套的ifs 等)。它的每个分支都应该从函数中显式返回,或者调用一些-> ! 函数(例如process::exit)。
为了与其他程序员的交流,以及保护自己免受自己的伤害,我想告诉编译器断言match 之后的任何内容都无法访问。我知道它知道如何静态地执行此操作,因为如果我将代码放在那里,我会收到编译时警告。
我尝试过的两件事:
将
match语句分配给let _: ! = match ...。但是,!仍处于试验阶段,所以这不起作用将
match包裹在闭包move || -> ! { match ... }();中。但是,这限制了我只能从父函数return。
我的情况的具体细节不一定普遍适用:
- 有问题的函数是
fn main() -> () - 条件逻辑必须要么发散到
()-returning 函数,要么发散到!-returning 函数 - 不这样做表示错误未正确处理或报告的路径
-
return-ing 条件逻辑中的函数需要在那里使用匹配解包的值
【问题讨论】:
-
“我知道它知道如何静态地执行此操作,因为如果我将代码放在那里,我会收到编译时警告。”所以只要把警告变成错误就完成了吗?
-
我不知道静态是否可行,但对于文档方面和运行时检查,您始终可以在匹配后添加
unreachable!()。 -
提供一个具体的最小例子来说明这里想要改进的地方真的很有帮助。函数的返回类型是什么?考虑到
match表达式是函数的最后一个表达式,为什么不将函数的末尾留空,并使用此匹配的结果作为其最终输出呢?匹配表达式已经被要求是详尽的。 -
@trentcl 抱歉,我可能说错了(我不一定知道这些术语定义的所有角落)。我只是指包含
return foo();的路径,其中foo() -> ()并且因此match语句将永远不会完成(由于return)——我的意思是“分歧”。
标签: rust