为什么我不能在 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)
}
我认为在使用花括号时存在一些歧义,但我不完全明白它可能是什么。这里有什么问题?
考虑以下示例:
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)
}
我认为在使用花括号时存在一些歧义,但我不完全明白它可能是什么。这里有什么问题?