__rust_force_expr 到底是做什么的?

What exactly does __rust_force_expr do?

我正在查看 Rust 中的 vec![] 宏实现,并注意到它使用了 __rust_force_expr! 宏。这是后者的实现:

/// Force AST node to an expression to improve diagnostics in pattern position.
#[doc(hidden)]
#[macro_export]
#[unstable(feature = "liballoc_internals", issue = "none", reason = "implementation detail")]
macro_rules! __rust_force_expr {
    ($e:expr) => {
        $e
    };
}

有人可以更清楚地了解它到底做了什么吗?

它对如何使用宏没有任何结果,它只是通过告诉编译器宏的输出始终是单个表达式来提高宏使用不正确时的错误消息的质量,不是一个项目或多个表达式。

为改进而添加的特定错误是在模式匹配中使用 vec![],这是无效的(您不能在 Vec 上进行结构匹配):

let x: Option<Vec<i32>> = Some(vec![]);
match x {
    Some(my_vec![]) => println!("1"),
    _ => println!("2"),
};

结果

error[E0164]: expected tuple struct or tuple variant, found associated function `Vec::new`
  --> src/main.rs:9:9
   |
9  |         Vec::new()
   |         ^^^^^^^^^^ `fn` calls are not allowed in patterns
...
15 |     Some(my_vec![]) => println!("1"),
   |          --------- in this macro invocation
   |
   = help: for more information, visit https://doc.rust-lang.org/book/ch18-00-patterns.html
   = note: this error originates in the macro `mvec` (in Nightly builds, run with -Z macro-backtrace for more info)

这是一个相当令人困惑的错误,尤其是在使用 vec![1, 2, 3] 语法时。它看起来不像调用者中的任何函数调用。但是通过用 __rust_force_expr 包装 vec! 的主体,我们得到一个更好的错误:

error: arbitrary expressions aren't allowed in patterns
  --> src/main.rs:15:10
   |
15 |     Some(vec![]) => println!("1"),
   |          ^^^^^^
   |
   = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info)

这更有意义:vec![] 生成一个表达式,并且没有对宏后面的函数调用的引用。