rust - 如何在声明性宏中提前返回并推断返回类型?
问题描述
我有一个宏,它只生成一个结构的实例,如下所示:
macro_rules! foo {
() => {{
let baz_val = baz();
let bar_val = match bar() {
Ok(val) => val,
Err(err) => {
return Err(err);
}
};
Ok(Foo(baz_val, bar_val))
}};
}
如您所见,我根据bar()
函数的结果在宏中提前返回。然而,这被解决为一个错误,说:
Compiling playground v0.0.1 (/playground)
error[E0308]: mismatched types
--> src/main.rs:23:24
|
23 | return Err(err);
| ^^^^^^^^ expected `()`, found enum `Result`
...
32 | let foo_val = foo!();
| ------ in this macro invocation
|
= note: expected unit type `()`
found enum `Result<_, String>`
= note: this error originates in the macro `foo` (in Nightly builds, run with -Z macro-backtrace for more info)
For more information about this error, try `rustc --explain E0308`.
这也是具有完整最小可重复样本的操场的永久链接。
我认为这里的问题是类型推断。我想返回示例FooResult
中的一个实例,但宏无法推断它。
那么,如何在声明性宏中提前返回并推断/定义返回类型?
环境
- 锈病 1.55.0
解决方案
@Netwave 的答案的替代方法是使用仅夜间功能label-break-value
:
#![feature(label_break_value)]
macro_rules! foo {
() => {'foo: {
let baz_val = baz();
let bar_val = match bar() {
Ok(val) => val,
Err(err) => {
break 'foo Err(err);
}
};
Ok(Foo(baz_val, bar_val))
}};
}
我相信此功能被明确设计为能够从任意块“返回”,这几乎是您的情况。
推荐阅读
- php - Laravel: Make a Public Profile Page
- web-scraping - 用 BeautifulSoup 刮表——Python
- java - 理解 java play 中的异步调用
- reactjs - 使用 React 并尝试使用 axios 发布数据 - 出现空对象
- xamarin.forms - ACR.UserDialogs UWP Toast 总是显示在左上角
- apache-spark - spark在mesos之上运行-集群模式-aws实例EC2(1主1从)
- pandas - pandas 条件分组和计数值
- suds - suds 在 python3.8 中失败
- django - 在通过 OnetoOneField/ForeignKey 依赖的单个视图中使用多个 Django 表单
- java - 指示字符串中哪个元音出现的次数最多