为什么我不能在 return 位置的大括号式宏表达式上使用方法?

Why cannot I use methods on brace-style macro expression in return position?

考虑以下示例:

macro_rules! some {
    { $expr:expr } => { Some($expr) };
}

fn foo() -> Option<i32> {
    some! {
        42
    }.map(std::convert::identity)
}

此代码将无法编译并出现以下错误:

error: expected expression, found `.`

但是,如果我将结果绑定到临时变量,编译器将接受代码:

fn foo() -> Option<i32> {
    let result = some! {
        42
    }.map(std::convert::identity);

    result
}

如果我删除 map 的调用,代码也可以毫无问题地编译:

fn foo() -> Option<i32> {
    some! {
        42
    }
}

宏调用的圆括号和括号变体也可以正常工作:

fn foo() -> Option<i32> {
    some!(42).map(std::convert::identity)
}
fn foo() -> Option<i32> {
    some![42].map(std::convert::identity)
}

我认为在使用花括号时存在一些歧义,但我不完全明白它可能是什么。这里有什么问题?

这正是:https://github.com/rust-lang/rust/issues/40100

还有几个可能有趣的宏解析问题:https://github.com/rust-lang/rust/issues?q=is%3Aopen+label%3AA-macros+label%3AA-parser